Wednesday, November 4, 2009

Re: GWT Native Code Deployment

Hi, Adrian and Jeff.

Thanks again for the help from both of you. I greatly appreciate it.

I have two files in the server. One of them is SecurityServiceImpl and
the code looks like this (skipping the includes, etc.):
public class SecurityServiceImpl extends RemoteServiceServlet
implements SecurityService {
private static NativeCodeClass nativeCode=new NativeCodeClass();
private CompressClass compression=new CompressClass();
@Override
public CompressedMessage validatePassword(CompressedMessage m) {
String message=compression.Decompress(m);
String username=message.substring(0,message.indexOf(','));
String password=message.substring(message.indexOf(',')
+1,message.length());
String returnString=nativeCode.validatePassword(username, password);
CompressedMessage replyMessage=compression.Compress(returnString);
return replyMessage;
}
}
The other file is called NativeCodeClass and the code looks like this:
public class NativeCodeClass {
static {
System.loadLibrary("SolverLibrary");
}
public native String validatePassword(String username, String
password);
}

I have doublechecked that both of these files are definitely in the
server code (and these are the only files in the server code). When I
run the code from within hosted mode, this code works (i.e. finds the
SolverLibrary and checks the entered password, etc.). And (here comes
the important part), when I compile it and run it from within the
browser by pressing the Compile/Browse button from inside hosted mode,
it works just fine as well inside Mozilla. It fails when I copy the
directories to another place on the hard drive. Unless I am seriously
confused (and I have to admit that this is a possibility), if the
problem was one where the native code was executing inside of
Javascript, it could not run correctly from inside the browser after
the Compile/Browse step.

It occurs to me that maybe my RPC calls to the server are not
functioning correctly when I try to move the folders to somewhere else
on the hard drive. Is there an obvious reason why that might happen?
Thanks for all your help.

Darin

On Nov 4, 1:56 am, Adrian <ahay...@gmail.com> wrote:
> Hi guys,
>
> I think Darin might not be up to speed with the differences between
> server side and client side stuff and also how web environment differs
> from the desktop environment. You might know this already but if not
> it might clear a few things up.
>
> When developing an application with GWT in Eclipse you need to be
> aware of two distinct parts, the client side and the server
> side.Eclipse should setup a couple packages for these parts when you
> create a GWT project so you don't get confused. The client side is
> compiled from java to javascript that is designed to run only in a
> browser. That means the resulting javascript has all the limitations
> enforced by the browser, which includes no way to run native code. So
> GWT compiles the java in the client package to javascript, which is
> run in the browser once the browser requests it from your webserver
> (apache in this case). Because apache isn't a java application server
> (like tomcat, jetty etc) it cannot directly run the server side java
> (stuff in the server package).
>
> Things get a little confusing when you're running in hosted mode
> because a lot of fancy stuff is happening in the background so it
> appears the java code you have written for the client is running
> directly, it basically skips the compiling to javascript step and runs
> the client code as java. Because java has the ability to run native
> code it will appear to work, however once compiled to javascript it
> wont because javascript doesn't have the functionality (mainly for
> security reasons).
>
> Also don't be fooled by javascript's name, it is a very different
> language than java!
>
> So, you can't run native code from javascript in a browser, but you
> can run it from java on the server side. A possibly solution could be
> to use GWT's Remote Procedure Calls to run the native code on the
> server, then get the results sent to back to the client.
>
> Hope that helps,
> Adrian
>
> On Nov 4, 1:25 pm, Jeff Chimene <jchim...@gmail.com> wrote:
>
> > On Tue, Nov 3, 2009 at 3:47 PM, Darin <daring90...@gmail.com> wrote:
>
> > > Hi, Jeff. Again, thanks for the responses. I have researched what the
> > > classpath means (and I assume you mean the directory or directories
> > > where the JRE looks for possible libraries to use)
>
> > Yes
>
> > > and I have manually
> > > set the classpath to be the directory where the library resides.
> > > Unfortunately, that still did not change anything.
>
> > I didn't expect it would.
>
> > > To the best of my knowledge, the server itself isn't supposed to run
> > > the code.
>
> > The code that you posted originally (the call to LoadLibrary) should only
> > run on the server. It might also run on the client in hosted mode, but
> > that's not what you want in the Long Run.
>
> > According to the GWT website (please correct me if I am
>
> > > wrong, and it is very possible that I am wrong), the code is executed
> > > as Javascript from within the browser.
>
> > Correct, as long as you;re not trying to call LoadLibrary.
>
> > The Javascript that is already
>
> > > theoretically executing from within the browser is supposed to execute
> > > the native code.
>
> > I don't know what you mean by "native code". Do you mean the compiled C++
> > code in SolverLibrary? If so. the browser will not execute that native code
> > (at least not via GWT compiled Javascript)
>
> > For some reason, it finds the code on the computer on
>
> > > which I am developing the app, but cannot find the native code when I
> > > copy it directly to another machine (into the directory where Apache
> > > looks for its source files). I have copied the SolverLibrary into
> > > every subdirectory of the main Apache library that I can find but the
> > > native code still refuses to execute. I'm going to try installing
> > > Eclipse and GWT on the server machine and see if that helps. Wish me
> > > luck...
>
> > I think we're back to the issue that Apache doesn't have a JRE, so it's not
> > finding the code that calls LoadLibrary. I think that what's happening is
> > that in hosted mode, you're using Tomcat, a Java server which will find and
> > execute the code that calls LoadLibrary. When you move to GWT noserver mode,
> > then you're using Apache.
>
> > What is the error you get when you run the code using an Apache server
> > instance?
>
> > > Best, Darin
>
> > > On Nov 3, 2:14 pm, Jeff Chimene <jchim...@gmail.com> wrote:
> > > > Hi Darin:
>
> > > > After re-reading your first post, I think you're already in a
> > > client-server
> > > > environment. I am confused by the following:> I am running Windows XP and
> > > using Apache as my http server. Any ideas for
>
> > > > where I should put the native library so
>
> > > > > that the Javascript can find it?
>
> > > > Your Apache installation probably doesn't run Java
> > > > I think the reason it works in hosted mode is that your hosted mode
> > > server
> > > > is a Java server: Tomcat.
>
> > > > On Tue, Nov 3, 2009 at 2:59 PM, Jeff Chimene <jchim...@gmail.com> wrote:
>
> > > > > On Tue, Nov 3, 2009 at 2:36 PM, Darin <daring90...@gmail.com> wrote:
>
> > > > >> Hi, Jeff.
>
> > > > >> Thank you so much for responding to my question.
>
> > > > >> Perhaps I'm getting confused by the jargon. The "SolverLibrary" that I
> > > > >> wrote is written in C/C++ and compiled by Visual Studio into a DLL.
> > > > >> This DLL is supposed to be run only on the server. The GWT code was
> > > > >> written in Eclipse and follows essentially the documentation on the
> > > > >> GWT web site. At the moment, the C/C++ DLL is only checking whether a
> > > > >> username and password sent it by the client exists within a file on
> > > > >> the server (nothing fancy; there is no reason to do this in C/C++
> > > > >> other than to see if it will work) though I have plans to make much
> > > > >> more complicated native functions once I get this to work. I am not
> > > > >> sure where the "classpath" is. There is an environment variable in
> > > > >> Windows called the "PATH"; is that what you mean? I do call the
> > > > >> library via RPC. The calling code is as follows (written in Java in
> > > > >> Eclipse using GWT):
>
> > > > >> public class SecurityServiceImpl extends RemoteServiceServlet
> > > > >> implements SecurityService {
>
> > > > >>        private static NativeCodeClass nativeCode=new
> > > NativeCodeClass();
> > > > >>        private CompressClass compression=new CompressClass();
> > > > >>        @Override
> > > > >>        public CompressedMessage validatePassword(CompressedMessage m)
> > > {
> > > > >>                String message=compression.Decompress(m);
> > > > >>                String
> > > username=message.substring(0,message.indexOf(','));
> > > > >>                String password=message.substring(message.indexOf(',')
> > > > >> +1,message.length());
> > > > >>                String
> > > returnString=nativeCode.validatePassword(username,
> > > > >> password);
> > > > >>                CompressedMessage
> > > > >> replyMessage=compression.Compress(returnString);
> > > > >>                return replyMessage;
> > > > >>        }
> > > > >> }
>
> > > > >> Again, thanks for your help. Any other suggestions would be welcome.
> > > > >> Best, Darin
>
> > > > >> All the above has to run on the server (because it uses classes
> > > defined in
> > > > > SolverLibrary). You'll want to modify the above to handle requests from
> > > your
> > > > > client for solver library routines. The code you've posted so far will
> > > only
> > > > > run as Javascript on the client when SolverLibrary exists as
> > > Javascript;
> > > > > which condition is not true. The above code will run (as Java) on the
> > > client
> > > > > in Hosted mode (because SolverLibrary will be loaded by the Java
> > > run-time in
> > > > > Hosted mode); which is no good for what you want in the Long Run.
>
> > > > > On Nov 3, 7:27 am, Jeff Chimene <jchim...@gmail.com> wrote:
> > > > >> > Darin:
>
> > > > >> > There is one other possibility. You mention that you "... tested the
> > > > >> > compiled code (including the native
> > > > >> > code) inside the Mozilla browser and it also runs as it should."
>
> > > > >> > What's happening is that the Java run-time is able to load and run
> > > your
> > > > >> > library in hosted mode. But, that doesn't mean that you can compile
> > > this
> > > > >> > library to Javascript. Try putting the library into the classpath,
> > > > >> modify
> > > > >> > your code to instantiate whatever classes you need, and compile
> > > (rather
> > > > >> than
> > > > >> > run in hosted mode). You cannot use LoadLibrary on the client side:
> > > > >> there is
> > > > >> > no Java runtime.
>
> > > > >> > On Mon, Nov 2, 2009 at 4:37 PM, Darin <daring90...@gmail.com>
> > > wrote:
>
> > > > >> > > Hello.
>
> > > > >> > > I have written a GWT project that uses native code. The class that
> > > > >> > > calls the code looks like this:
>
> > > > >> > > public class NativeCodeClass {
> > > > >> > >        static {
> > > > >> > >                System.loadLibrary("SolverLibrary");
> > > > >> > >        }
> > > > >> > >        public native String validatePassword(String username,
> > > String
> > > > >> > > password);
> > > > >> > > }
>
> > > > >> > > When I compile and run this inside of Eclipse (hosted mode), the
> > > > >> > > native code runs (assuming that I uncheck the "Use Google App
> > > Engine")
> > > > >> > > just fine. I have also tested the compiled code (including the
> > > native
> > > > >> > > code) inside the Mozilla browser and it also runs as it should.
> > > > >> > > Unfortunately, when I deploy my code to the server, the Javascript
> > > > >> > > does not seem to be able to find my native library (SolverLibrary)
> > > > >> > > even though the Javascript is definitely working. I have tried
> > > copying
> > > > >> > > the library to every conceivable location that I could think of
> > > but
> > > > >> > > have thus far failed. I am running Windows XP and using
>
> ...
>
> read more »
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group.
To post to this group, send email to google-web-toolkit@googlegroups.com
To unsubscribe from this group, send email to google-web-toolkit+unsubscribe@googlegroups.com
For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en
-~----------~----~----~----~------~----~------~--~---

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home


Real Estate