org.epics.archiverappliance.mgmt.bpl.UploadChannelArchiverConfigAction.java Source code

Java tutorial

Introduction

Here is the source code for org.epics.archiverappliance.mgmt.bpl.UploadChannelArchiverConfigAction.java

Source

/*******************************************************************************
 * Copyright (c) 2011 The Board of Trustees of the Leland Stanford Junior University
 * as Operator of the SLAC National Accelerator Laboratory.
 * Copyright (c) 2011 Brookhaven National Laboratory.
 * EPICS archiver appliance is distributed subject to a Software License Agreement found
 * in file LICENSE that is included with this distribution.
 *******************************************************************************/
package org.epics.archiverappliance.mgmt.bpl;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.PrintWriter;
import java.util.LinkedList;
import java.util.List;

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

import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.output.NullOutputStream;
import org.apache.log4j.Logger;
import org.epics.archiverappliance.common.BPLAction;
import org.epics.archiverappliance.config.ConfigService;
import org.epics.archiverappliance.config.ChannelArchiver.EngineConfigParser;
import org.epics.archiverappliance.config.ChannelArchiver.PVConfig;
import org.epics.archiverappliance.mgmt.policy.PolicyConfig.SamplingMethod;

/**
 * Use this to upload a Channel Archiver configuration file.
 * @author mshankar
 *
 */
public class UploadChannelArchiverConfigAction implements BPLAction {
    private static final Logger logger = Logger.getLogger(UploadChannelArchiverConfigAction.class);

    @Override
    public void execute(HttpServletRequest req, HttpServletResponse resp, ConfigService configService)
            throws IOException {

        // Check that we have a file upload request
        boolean isMultipart = ServletFileUpload.isMultipartContent(req);
        if (!isMultipart) {
            throw new IOException("HTTP request is not sending multipart content; therefore we cannnot process");
        }

        // Create a new file upload handler
        ServletFileUpload upload = new ServletFileUpload();
        List<String> fieldsAsPartOfStream = ArchivePVAction.getFieldsAsPartOfStream(configService);
        try (PrintWriter out = new PrintWriter(new NullOutputStream())) {
            FileItemIterator iter = upload.getItemIterator(req);
            while (iter.hasNext()) {
                FileItemStream item = iter.next();
                String name = item.getFieldName();
                if (item.isFormField()) {
                    logger.debug("Form field " + name + " detected.");
                } else {
                    logger.debug("File field " + name + " with file name " + item.getName() + " detected.");
                    try (InputStream is = new BufferedInputStream(item.openStream())) {
                        is.mark(1024);
                        logger.info((new LineNumberReader(new InputStreamReader(is))).readLine());
                        is.reset();
                        LinkedList<PVConfig> pvConfigs = EngineConfigParser.importEngineConfig(is);
                        for (PVConfig pvConfig : pvConfigs) {
                            boolean scan = !pvConfig.isMonitor();
                            float samplingPeriod = pvConfig.getPeriod();
                            if (logger.isDebugEnabled())
                                logger.debug("Adding " + pvConfig.getPVName() + " using "
                                        + (scan ? SamplingMethod.SCAN : SamplingMethod.MONITOR)
                                        + " and a period of " + samplingPeriod);
                            ArchivePVAction.archivePV(out, pvConfig.getPVName(), true,
                                    scan ? SamplingMethod.SCAN : SamplingMethod.MONITOR, samplingPeriod, null, null,
                                    null, false, configService, fieldsAsPartOfStream);
                        }
                    } catch (Exception ex) {
                        logger.error("Error importing configuration", ex);
                        resp.sendRedirect("../ui/integration.html?message=Error importing config file "
                                + item.getName() + " " + ex.getMessage());
                        return;
                    }
                }
            }
            resp.sendRedirect("../ui/integration.html?message=Successfully imported configuration files");
        } catch (FileUploadException ex) {
            throw new IOException(ex);
        }

    }

}