xbdd.webapp.resource.feature.UploadAttachment.java Source code

Java tutorial

Introduction

Here is the source code for xbdd.webapp.resource.feature.UploadAttachment.java

Source

/**
 * Copyright (C) 2015 Orion Health (Orchestral Development Ltd)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package xbdd.webapp.resource.feature;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import javax.inject.Inject;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;

import org.glassfish.jersey.media.multipart.FormDataBodyPart;
import org.glassfish.jersey.media.multipart.FormDataParam;

import xbdd.webapp.factory.MongoDBAccessor;

import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSInputFile;

@Path("/rest/upload-attachment")
@MultipartConfig
public class UploadAttachment {

    private final MongoDBAccessor client;

    @Inject
    public UploadAttachment(final MongoDBAccessor client) {
        this.client = client;
    }

    @SuppressWarnings("unchecked")
    @POST
    @Path("/{elementId}/{report}/{version}/{build}/{id}")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public String setAttachment(@PathParam("report") final String report,
            @PathParam("version") final String version, @PathParam("build") final String build,
            @PathParam("id") final String id, @PathParam("elementId") final String elementId,
            @FormDataParam("attachmentfile") final File file,
            @FormDataParam("attachmentfile") final FormDataBodyPart body, @Context final HttpServletRequest req)
            throws IOException {
        try (final InputStream is = new FileInputStream(file.getAbsolutePath())) {
            final String elementIdMod = elementId.replace("&2F", "/");
            final DB gridDB = this.client.getDB("grid");
            final GridFS gridFS = new GridFS(gridDB);
            final GridFSInputFile gridFile = gridFS.createFile(is);
            gridFile.setFilename(
                    body.getMediaType().toString().split("/")[0] + ".x1.mu." + UUID.randomUUID().toString());
            gridFile.setContentType(body.getMediaType().toString());
            gridFile.save();
            final DB bddDB = this.client.getDB("bdd");
            final DBCollection collection = bddDB.getCollection("features");
            // // get object
            final String featureId = report + "/" + version + "/" + build + "/" + id;
            final DBObject feature = collection.findOne(new BasicDBObject("_id", featureId));
            final BasicDBList elements = (BasicDBList) feature.get("elements");
            String scenarioName = "";
            if (elements != null) {
                for (int i = 0; i < elements.size(); i++) {
                    final DBObject scenario = (DBObject) elements.get(i);
                    if (scenario.get("id").equals(id + ";" + elementIdMod)) {
                        scenarioName = (String) scenario.get("name");
                        // get steps
                        final BasicDBList steps = (BasicDBList) scenario.get("steps");
                        final DBObject laststep = (DBObject) steps.get(steps.size() - 1);
                        List<String> embeddings = new ArrayList<String>();
                        if (laststep.containsField("embeddings")) {
                            embeddings = (ArrayList<String>) laststep.get("embeddings");
                        }
                        embeddings.add(gridFile.getFilename()); // get existng then add to them
                        laststep.put("embeddings", embeddings);
                        steps.set(steps.size() - 1, laststep);
                        scenario.put("steps", steps);
                        elements.set(i, scenario);
                    }
                }
            }
            feature.put("elements", elements);
            feature.put("statusLastEditedBy", req.getRemoteUser());
            feature.put("lastEditOn", new Date());

            // add edit update
            BasicDBList edits = (BasicDBList) feature.get("edits");
            if (edits == null) {
                edits = new BasicDBList();
            }
            final BasicDBList temp = new BasicDBList();
            temp.add(new BasicDBObject().append("id", "embeddings").append("added", gridFile.getFilename())
                    .append("removed", null));

            final BasicDBList masks = new BasicDBList();
            masks.add(new BasicDBObject().append("scenario", scenarioName).append("changes", temp));

            final BasicDBObject edit = new BasicDBObject().append("name", feature.get("statusLastEditedBy"))
                    .append("date", feature.get("lastEditOn")).append("prev", feature.get("calculatedStatus"))
                    .append("curr", feature.get("calculatedStatus")).append("stepChanges", masks);

            final BasicDBList newEdits = new BasicDBList();
            newEdits.add(edit);
            newEdits.addAll(edits);
            feature.put("edits", newEdits);

            collection.save(feature);
            return gridFile.getFilename();
        }
    }
}