I AM LOSING MY F***ING MIND OVER THIS.

For over a year now I've been learning web development using Google Cloud 
Platform and studying online resources. I've gone through an excruciating 
amount of trial and error over the past year, but no matter what formidable 
brick wall I ran into, I always managed to find a solution without making 
any new forum posts or asking for help. But this is just killing me.

I am trying to get a basic user login system set up for a basic website. 
Right now I am not worrying too much about security, I am just trying to 
lay the foundation for a custom user database that I can use for 
authorization on this site. For the sake of simplicity and understanding in 
the beginning stages of building this auth system, I have based my user 
entity creation template on the same template that I'm using for the 
creation of posts, albums, and photos, a template found in the Java 
Bookshelf App tutorial. My application has no problem creating post, album, 
and photo entities, and since my user entity is created with the same exact 
template as those entities, I DO NOT UNDERSTAND WHY IT IS NOT WORKING!!!

I am using Datastore on App Engine Java using JSPs and Servlets. My project 
is built with Maven, and my local development server is run with Jetty.

*My JSP signup form:*

<form method="POST" action="${destination}" enctype="multipart/form-data">
        
            <div class="form-group">
                <label for="email">Email</label>
                <input class="form-control" type="text" id="email" name=
"email" placeholder="Email"/>
            </div>
            <div class="form-group">
                <label for="password">Password</label>
                <input class="form-control" type="password" id="password" 
name="password" placeholder="Password"/>
            </div>
            <div class="form-group">
                <label for="username">Display Name</label>
                <input class="form-control" type="text" id="username" name=
"username" placeholder="Display Name"/>
            </div>
            <div class="form-group">
                <label for="file">Profile Image</label>
                <input class="form-control" type="file" id="file" name=
"file"/>
            </div>

            <div class="form-group hidden">
                <label for="imageUrl">Image URL</label>
                <input type="text" name="imageUrl" id="imageUrl" value=
"${fn:escapeXml(imageUrl)}" class="form-control" />
            </div>
            
            <br/><br/>
        
<button class="btn" type="submit" id="signup" name="signup">Sign Up</button>
        
        </form>

*...which submits a POST request to my signup servlet:*

public void doPost(HttpServletRequest req, HttpServletResponse resp) throws 
ServletException,
     IOException {

         String state = new BigInteger(130, new SecureRandom()).toString(32); 
// prevent request forgery
         req.getSession().setAttribute("state", state);

         if (req.getAttribute("loginDestination") != null) {
         req
         .getSession()
         .setAttribute("loginDestination", (String) req.getAttribute(
"loginDestination"));
         logger.log(
         Level.INFO, "logging destination " + (String) req.getAttribute(
"loginDestination"));
         } else {
         req.getSession().setAttribute("loginDestination", "/Home");
         logger.log(Level.INFO, "logging destination /Home");
         }
         
         CloudStorageHelper storageHelper =
         (CloudStorageHelper) req.getServletContext().getAttribute(
"storageHelper");
         String imageUrl =
         storageHelper.getImageUrl(
         req, resp, getServletContext().getInitParameter("skelly.bucket"));
         
            UserDao dao = (UserDao) this.getServletContext().getAttribute(
"userDao");
            
            byte[] salt = new SecureRandom().generateSeed(32);
            byte[] hash = hashPassword(req.getParameter("password").
toCharArray(), salt, 27, 256);
            String saltS = salt.toString();
            String hashS = hash.toString();
            String email = req.getParameter("email");

            User user = new User.Builder()
                .email(email)
                .hash(hashS)
                .salt(saltS)
                .imageUrl(imageUrl)
                .build();

            try {
                dao.createUser(user);

                byte[] key = (byte[]) req.getSession().getAttribute("state"
);
                Date date = new Date();
                Calendar cal = Calendar.getInstance();
                cal.setTime(date);
                cal.add(Calendar.HOUR, 12);
                Date exp = cal.getTime();
                String iss = req.getScheme() + "://" +
                            req.getServerName() + ":" +
                            req.getServerPort();
                String sub = (String) req.getAttribute("email");             

        
                String jwt = 
                    Jwts.builder().setIssuer(iss)
                        .setSubject(sub)
                        .setExpiration(exp)
                        .claim("scope", "self api/buy") 
                        .signWith(SignatureAlgorithm.HS256, key)
                        .compact();

                req.getSession().setAttribute("token", jwt);
                req.getSession().setAttribute("userEmail", req.getParameter(
"email"));
                req.getSession().setAttribute("userImage", imageUrl);
                resp.sendRedirect("/Home");
            } catch(Exception e) {
                throw new ServletException(e.getMessage(), e);
            }

     }

*...which calls the createUser() method in my UserDatastore servlet:*

public Long createUser(User user) throws SQLException, IOException {

        IncompleteKey key = keyFactory.newKey(); // Key will be assigned 
once written
        FullEntity<IncompleteKey> incUserEntity = Entity.newBuilder(key) // 
Create the Entity
     .set(User.EMAIL, user.getEmail())
     .set(User.SALT, user.getSalt())
            .set(User.HASH, user.getHash())
            .set(User.IMAGE_URL, user.getImageUrl())

            .build(); // <---- THIS IS WHERE THE ERROR OCCURS!!! \\

        Entity userEntity = datastore.add(incUserEntity); // Save the Entity
        return userEntity.getKey().getId();
    }

*...which leads to this 500 Server Error:*

HTTP ERROR 500

Problem accessing /SignupEmail. Reason:

    Server Error

Caused by:

javax.servlet.ServletException: javax.servlet.ServletException
        at 
org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:138)
        at 
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
        at org.eclipse.jetty.server.Server.handle(Server.java:564)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:320)
        at 
org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251)
        at 
org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:110)
        at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)
        at 
org.eclipse.jetty.util.thread.Invocable.invokePreferred(Invocable.java:122)
        at 
org.eclipse.jetty.util.thread.strategy.ExecutingExecutionStrategy.invoke(ExecutingExecutionStrategy.java:58)
        at 
org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:201)
        at 
org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:133)
        at 
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:672)
        at 
org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:590)
        at java.lang.Thread.run(Thread.java:748)
Caused by: javax.servlet.ServletException
        at com.example.getstarted.auth.SignupEmail.doPost(SignupEmail.java:137)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
        at 
org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:841)
        at 
org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1634)
        at 
org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:206)
        at 
org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1621)
        at 
com.example.getstarted.util.DatastoreSessionFilter.doFilter(DatastoreSessionFilter.java:109)
        at 
org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1613)
        at 
org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:541)
        at 
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
        at 
org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
        at 
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
        at 
org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:190)
        at 
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1593)
        at 
org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188)
        at 
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1239)
        at 
org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:168)
        at 
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:481)
        at 
org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1562)
        at 
org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:166)
        at 
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1141)
        at 
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
        at 
org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213)
        at 
org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:118)
        ... 14 more
Caused by: java.lang.NullPointerException
        at 
com.google.common.base.Preconditions.checkNotNull(Preconditions.java:770)
        at 
com.google.common.collect.NaturalOrdering.compare(NaturalOrdering.java:36)
        at 
com.google.common.collect.NaturalOrdering.compare(NaturalOrdering.java:25)
        at 
com.google.common.collect.ByFunctionOrdering.compare(ByFunctionOrdering.java:43)
        at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)
        at java.util.TimSort.sort(TimSort.java:220)
        at java.util.Arrays.sort(Arrays.java:1512)
        at 
com.google.common.collect.ImmutableSortedMap.fromEntries(ImmutableSortedMap.java:390)
        at 
com.google.common.collect.ImmutableSortedMap.fromEntries(ImmutableSortedMap.java:362)
        at 
com.google.common.collect.ImmutableSortedMap.copyOfInternal(ImmutableSortedMap.java:346)
        at 
com.google.common.collect.ImmutableSortedMap.copyOf(ImmutableSortedMap.java:237)
        at com.google.cloud.datastore.BaseEntity.<init>(BaseEntity.java:458)
        at com.google.cloud.datastore.FullEntity.<init>(FullEntity.java:47)
        at 
com.google.cloud.datastore.FullEntity$Builder.build(FullEntity.java:42)
        at 
com.example.getstarted.daos.UserDatastore.createUser(UserDatastore.java:115)
        at com.example.getstarted.auth.SignupEmail.doPost(SignupEmail.java:111)
        ... 38 more


*Normally I am able to diagnose the problem by looking at the errors, 
locating the problem, researching the problem, and finding a solution. But 
this error is different than anything I have ever experienced for several 
reasons:*

*1. It is a NullPointerException, but through testing I have not been able 
to find where there is a null value.*

*2. It is thrown by the method checkNotNull which I have found little 
discussions about, none of which helped me understand my specific dilemma.*

*3. The method that is throwing this error (createUser) is nearly IDENTICAL 
to my other methods (createPost, createAlbum, createPhoto) that work just 
fine, so this method should be working as well.*

*I have jumped dozens of complicated troubleshooting hurdles in the past 
year, but I'm completely stumped on this one. I cannot find any reason 
whatsoever that this error is being thrown.*

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/google-appengine.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/google-appengine/896b717a-7d34-4e86-8e9f-3975b4d0d17e%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
  • [google-appengine... Kat

Reply via email to