Android Open Source - dissertation-project Blobstore Upload Handler






From Project

Back to project page dissertation-project.

License

The source code is released under:

MIT License

If you think the Android project dissertation-project listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.fyp.widerst.handler;
/*from w  ww .  j  ava 2  s.  c om*/
import static com.fyp.widerst.WiderstObjectifyService.ofy;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.fyp.widerst.Constants;
import com.fyp.widerst.entity.DataPiece;
import com.fyp.widerst.entity.DataWhole;
import com.fyp.widerst.util.DbHelper;
import com.google.appengine.api.backends.BackendServiceFactory;
import com.google.appengine.api.blobstore.BlobInfo;
import com.google.appengine.api.blobstore.BlobInfoFactory;
import com.google.appengine.api.blobstore.BlobKey;
import com.google.appengine.api.blobstore.BlobstoreService;
import com.google.appengine.api.blobstore.BlobstoreServiceFactory;
import com.google.appengine.api.taskqueue.Queue;
import com.google.appengine.api.taskqueue.QueueFactory;
import com.google.appengine.api.taskqueue.TaskOptions;
import com.googlecode.objectify.Key;
import com.googlecode.objectify.Work;

@SuppressWarnings("serial")
public class BlobstoreUploadHandler extends HttpServlet {

    private static final Logger log = Logger.getLogger(BlobstoreUploadHandler.class.getName());
    private final BlobstoreService blobStore = BlobstoreServiceFactory.getBlobstoreService();
    private final BlobInfoFactory blobInfoFactory = new BlobInfoFactory();

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException,
            IOException {
        Map<String, List<BlobKey>> blobs = blobStore.getUploads(req);
        log.log(Level.INFO, "This many Blobs were found in the POST " + blobs.size());

        final String dwKeyParam = req.getParameter("dataWholeId");
        final String dpKeyParam = req.getParameter("dataPieceId");

        final BlobKey blobKey = blobs.values().iterator().next().get(0);
        final BlobInfo blobInfo = blobInfoFactory.loadBlobInfo(blobKey);

        Integer blobTransaction = ofy().transact(new Work<Integer>() {

            @Override
            public Integer run() {

                final DataWhole dataWhole = DbHelper.findDataWholeByKey(dwKeyParam);
                final DataPiece dataPiece = DbHelper.findDataPieceByKeyAndParent(dpKeyParam, dataWhole);

                if (null == dataPiece) {
                    return HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
                } else {

                    if (dataPiece.getHash().contentEquals(blobInfo.getMd5Hash())) {
                        /* Ensure the hash values match */
                        dataPiece.setBlobKey(blobKey);
                        Boolean dpTransaction = ofy().transact(new Work<Boolean>() {
                            @Override
                            public Boolean run() {
                                return ofy().save().entity(dataPiece).now() != null ? true : false;
                            }
                        });

                        if (dpTransaction) {
                            /*
                             * Check if this was the last piece to be added. If
                             * so, then we must send a request to the Backend
                             * server to perform a re-structure.
                             */

                            int blobCount = 0;
                            final Map<Key<DataPiece>, DataPiece> pieces = ofy().load().keys(dataWhole.getDataPieceKeyList());
                            
                            if (pieces.size() == dataWhole.getNumOfPieces()) {
                                for (DataPiece blobbedDatatPiece : pieces.values()) {
                                    if (null != blobbedDatatPiece.getBlobKey()) {
                                        blobCount++;
                                    }
                                }
                            }

                            if (blobCount == dataWhole.getNumOfPieces()) {
                                log.log(Level.INFO, "Transaction complete. Server has total pieces");
                                Queue fileJoinerQueue = QueueFactory.getQueue("fileJoinQueue");
                                fileJoinerQueue.add(createBackendTask(dataWhole));
                            }

                            return HttpServletResponse.SC_OK;

                        } else {
                            log.log(Level.SEVERE, "Transaction failed!");
                        }

                    } else {
                        /*
                         * If the MD5 Hashes do not match then the client must
                         * re-upload
                         */
                        return HttpServletResponse.SC_CONFLICT;

                    }
                    return HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
                }
            }
        });

        resp.setStatus(blobTransaction);
    }

    private TaskOptions createBackendTask(DataWhole dataWhole) {
        /* Create a TaskOptions object which can then be posted to a back end */

        TaskOptions taskOptions = null;
        taskOptions = TaskOptions.Builder
                .withUrl("/joinFile")
                .param(Constants.DATAWHOLE_KEY_PARAM, dataWhole.getKey())
                .header("Host", BackendServiceFactory.getBackendService().getBackendAddress("filejoin"))
                .method(TaskOptions.Method.POST);

        return taskOptions;

    }
}




Java Source Code List

com.fyp.resilience.Constants.java
com.fyp.resilience.Flags.java
com.fyp.resilience.GCMIntentService.java
com.fyp.resilience.PreferenceConstants.java
com.fyp.resilience.ResilienceApplication.java
com.fyp.resilience.ResilienceController.java
com.fyp.resilience.activity.LicenceActivity.java
com.fyp.resilience.activity.ResilienceActivity.java
com.fyp.resilience.activity.SettingsActivity.java
com.fyp.resilience.adapter.ClientListAdapter.java
com.fyp.resilience.adapter.ConnectionListAdapter.java
com.fyp.resilience.adapter.FileListAdapter.java
com.fyp.resilience.connection.Connectable.java
com.fyp.resilience.connection.ServerDownloadConnectable.java
com.fyp.resilience.connection.ServerUploadConnectable.java
com.fyp.resilience.connection.UploadConnectable.java
com.fyp.resilience.connection.WifiDownloadConnectable.java
com.fyp.resilience.connection.WifiUploadConnectable.java
com.fyp.resilience.database.ResilienceDbHelper.java
com.fyp.resilience.database.ResilienceDbManager.java
com.fyp.resilience.database.model.DataPiece.java
com.fyp.resilience.database.model.DataWhole.java
com.fyp.resilience.event.ClientListChanged.java
com.fyp.resilience.event.ClientModified.java
com.fyp.resilience.event.ConnectionProgressChange.java
com.fyp.resilience.event.ConnectionStateChange.java
com.fyp.resilience.event.ConnectionsModified.java
com.fyp.resilience.event.PieceStateChange.java
com.fyp.resilience.event.ServerRegistrationChanged.java
com.fyp.resilience.event.ServerUploadFinished.java
com.fyp.resilience.event.WholeModified.java
com.fyp.resilience.event.WifiDownloadFinished.java
com.fyp.resilience.event.WifiUploadFinished.java
com.fyp.resilience.fragment.ClientsFragment.java
com.fyp.resilience.fragment.ConnectionsFragment.java
com.fyp.resilience.fragment.FilesFragment.java
com.fyp.resilience.interfaces.Messagable.java
com.fyp.resilience.interfaces.Partialable.java
com.fyp.resilience.proto.ProtoBuffSpecification.java
com.fyp.resilience.receiver.AbstractConnectivityBroadcastReceiver.java
com.fyp.resilience.receiver.BootReceiver.java
com.fyp.resilience.receiver.ConnectivityBroadcastReceiver.java
com.fyp.resilience.receiver.WiFiDirectBroadcastReceiver.java
com.fyp.resilience.register.RegisterRequestInitializer.java
com.fyp.resilience.register.RegisterRequest.java
com.fyp.resilience.register.RegisterScopes.java
com.fyp.resilience.register.Register.java
com.fyp.resilience.register.model.DeviceInfo.java
com.fyp.resilience.service.PieceUploadService.java
com.fyp.resilience.stream.PiecedRandomAccessFile.java
com.fyp.resilience.swarm.helper.NsdHelper.java
com.fyp.resilience.swarm.helper.SwarmHelperInterface.java
com.fyp.resilience.swarm.helper.WifiDirectSdHelper.java
com.fyp.resilience.swarm.model.SwarmClient.java
com.fyp.resilience.thread.ResilienceRunnable.java
com.fyp.resilience.thread.ResilienceThreadFactory.java
com.fyp.resilience.util.ConnectionUtils.java
com.fyp.resilience.util.Utils.java
com.fyp.resilience.view.ClientView.java
com.fyp.resilience.view.ConnectionView.java
com.fyp.resilience.view.FileView.java
com.fyp.resilience.view.PieceProgressIndicator.java
com.fyp.resilience.widerst.WiderstRequestInitializer.java
com.fyp.resilience.widerst.WiderstRequest.java
com.fyp.resilience.widerst.WiderstScopes.java
com.fyp.resilience.widerst.Widerst.java
com.fyp.resilience.widerst.model.DataPiecePartial.java
com.fyp.resilience.widerst.model.DataWholePartial.java
com.fyp.resilience.widerst.model.PostResponse.java
com.fyp.widerst.Constants.java
com.fyp.widerst.WiderstObjectifyService.java
com.fyp.widerst.backend.FileJoinerBackend.java
com.fyp.widerst.cron.CronJobServlet.java
com.fyp.widerst.endpoint.DataPieceEndpoint.java
com.fyp.widerst.endpoint.DeviceInfoEndpoint.java
com.fyp.widerst.entity.DataPiece.java
com.fyp.widerst.entity.DataWhole.java
com.fyp.widerst.entity.DeviceInfo.java
com.fyp.widerst.handler.BlobstoreUploadHandler.java
com.fyp.widerst.partial.DataPiecePartial.java
com.fyp.widerst.partial.DataWholePartial.java
com.fyp.widerst.response.PostResponse.java
com.fyp.widerst.servlet.WholeFileServer.java
com.fyp.widerst.util.DbHelper.java
com.fyp.widerst.util.GcmHelper.java