org.cvit.cabig.dmr.cmef.server.NewModelResource.java Source code

Java tutorial

Introduction

Here is the source code for org.cvit.cabig.dmr.cmef.server.NewModelResource.java

Source

/*L
 * Copyright The General Hospital Corporation d/b/a Massachusetts General Hospital
 *
 * Distributed under the OSI-approved BSD 3-Clause License.
 * See http://ncip.github.com/digital-model-repository/LICENSE.txt for details.
 */

package org.cvit.cabig.dmr.cmef.server;

import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.cvit.cabig.dmr.cmef.AuthorizationException;
import org.cvit.cabig.dmr.cmef.RepositoryException;
import org.cvit.cabig.dmr.cmef.domain.ComputationalModel;
import org.cvit.cabig.dmr.cmef.domain.ComputingPlatform;
import org.cvit.cabig.dmr.cmef.domain.File;
import org.cvit.cabig.dmr.cmef.domain.Parameter;
import org.cvit.cabig.dmr.cmef.domain.ProgrammingPlatform;
import org.restlet.data.MediaType;
import org.restlet.data.Reference;
import org.restlet.data.Status;
import org.restlet.ext.fileupload.RestletFileUpload;
import org.restlet.ext.freemarker.TemplateRepresentation;
import org.restlet.representation.Representation;
import org.restlet.representation.StringRepresentation;
import org.restlet.resource.Get;
import org.restlet.resource.Post;
import org.restlet.resource.ResourceException;

import freemarker.template.SimpleHash;

public class NewModelResource extends CmefServerResource {
    private String entryName;

    @Override
    protected void doInit() throws ResourceException {
        super.doInit();

        this.entryName = (String) getRequestAttributes().get(CmefServer.ENTRY_VAR);
    }

    @Get("htm|html")
    public Representation getNewModelForm() {
        SimpleHash root = new SimpleHash();
        root.put("entryName", entryName);
        root.put("funcs", new TemplateFunctions());

        return new TemplateRepresentation("newModel.html", getFreeMarkerConfig(), root, MediaType.TEXT_HTML);
    }

    @Post("multi")
    public Representation newModelFromForm(Representation formRep) {
        //TODO: rework to use FileUpload Streaming API...
        DiskFileItemFactory factory = new DiskFileItemFactory();
        RestletFileUpload upload = new RestletFileUpload(factory);
        List<FileItem> items;
        try {
            items = upload.parseRepresentation(formRep);
        } catch (FileUploadException e) {
            throw new ResourceException(Status.SERVER_ERROR_INTERNAL,
                    "Exception parsing multipart form: " + e.getMessage(), e);
        }
        ComputationalModel model = parseModel(items);

        model = addModel(model);

        FileItem iframeItem = items.get(items.size() - 1);
        if (iframeItem.getString().equals("true")) {
            return new StringRepresentation(buildIframeResponse(model), MediaType.TEXT_HTML);
        } else {
            Reference modelRef = getNamespace().modelRef(entryName, getResolver().getModelName(model.getId()),
                    true);
            redirectSeeOther(modelRef);
            return new StringRepresentation("Model created, URL: " + modelRef.toString() + ".");
        }
    }

    private ComputationalModel parseModel(List<FileItem> items) {
        int idx = 0;
        //TODO: refactor...cleanup...
        //TODO: verify values...
        ComputationalModel result = new ComputationalModel();
        result.setTitle(items.get(idx++).getString());
        result.setVersion(items.get(idx++).getString());
        result.setDescription(items.get(idx++).getString());
        result.setComment(items.get(idx++).getString());
        if (!items.get(idx).isFormField()) {
            result.setDocument(storeFile(items.get(idx++)));
        } else {
            String url = items.get(idx++).getString();
            if (url != null) {
                File file = new File();
                //TODO: Should probably just get the local name
                file.setName(parseUri(url).getPath());
                file.setSource(url);
                result.setDocument(file);
            }
        }
        ProgrammingPlatform prog = new ProgrammingPlatform();
        prog.setLanguageType(items.get(idx++).getString());
        prog.setLanguageVersion(items.get(idx++).getString());
        result.setProgram(prog);
        ComputingPlatform comp = new ComputingPlatform();
        comp.setOperatingSystemType(items.get(idx++).getString());
        comp.setProcessorArchitecture(items.get(idx++).getString());
        result.setPlatforms(Collections.singleton(comp));
        if (!items.get(idx).isFormField()) {
            File file = storeFile(items.get(idx++));
            if (file != null) {
                result.setFiles(Collections.singleton(file));
            }
        } else {
            String url = items.get(idx++).getString();
            if (url != null) {
                File file = new File();
                //TODO: Should probably just get the local name
                file.setName(parseUri(url).getPath());
                file.setSource(url);
                result.setFiles(Collections.singleton(file));
            }
        }
        List<Parameter> params = new ArrayList<Parameter>();
        boolean isParam = items.get(idx).getFieldName().startsWith("param");
        while (isParam) {
            Parameter param = new Parameter();
            param.setName(items.get(idx++).getString());
            param.setDescription(items.get(idx++).getString());
            param.setDataType(items.get(idx++).getString());
            if (param.getDataType().equals("file")) {
                param.setIsFile(Boolean.TRUE);
            } else {
                param.setIsFile(Boolean.FALSE);
            }
            param.setPrefix(items.get(idx++).getString());
            List<String> choices = new ArrayList<String>();
            boolean isChoice = items.get(idx).getFieldName().contains("choice");
            while (isChoice) {
                choices.add(items.get(idx++).getString());
                isChoice = items.get(idx).getFieldName().contains("choice");
            }
            param.setChoices(choices);
            param.setDefaultValue(items.get(idx++).getString());
            if (items.get(idx).getFieldName().contains("opt")) {
                idx++;
                param.setIsOptional(Boolean.TRUE);
            } else {
                param.setIsOptional(Boolean.FALSE);
            }
            params.add(param);
            isParam = items.get(idx).getFieldName().startsWith("param");
        }
        result.setParameters(params);
        result.setCommandLine(items.get(idx++).getString());
        return result;
    }

    private ComputationalModel addModel(ComputationalModel model) {
        try {
            return getRepository().addModelToEntry(model, entryRef(getResolver().getEntryId(entryName)));
        } catch (RepositoryException e) {
            throw new ResourceException(Status.SERVER_ERROR_INTERNAL,
                    "Exception adding model to CMEF repository: " + e.getMessage(), e);
        } catch (AuthorizationException e) {
            throw new ResourceException(Status.CLIENT_ERROR_FORBIDDEN,
                    "User " + getCurrentUser() + " is not authorized to add a model.", e);

        }
    }

    private org.cvit.cabig.dmr.cmef.domain.File storeFile(FileItem item) {
        if (item.getName() == null || item.getName().equals("")) {
            return null;
        }
        InputStream is;
        try {
            is = item.getInputStream();
        } catch (IOException e) {
            throw new ResourceException(Status.SERVER_ERROR_INTERNAL,
                    "Exception uploading files: " + e.getMessage(), e);
        }
        return storeFile(item.getName(), is);
    }

    private URI parseUri(String uri) {
        try {
            return new URI(uri);
        } catch (URISyntaxException e) {
            throw new ResourceException(Status.CLIENT_ERROR_BAD_REQUEST, "Invalid URL specified.", e);
        }
    }

    private String buildIframeResponse(ComputationalModel model) {
        StringBuilder response = new StringBuilder("<html><head><title>Model Created</title></head><body>");
        response.append("Added model: <span id=\"model-id\">").append(model.getId()).append("</span>");
        response.append("<script type=\"text/javascript\">if (window.parent.cmef) {");
        response.append("window.parent.cmef.addedModel('").append(model.getId()).append("');");
        response.append("}</script></body></html>");
        return response.toString();
    }
}