Package at.tuwien.minimee.migration

Source Code of at.tuwien.minimee.migration.MigrationService

/*******************************************************************************
* Copyright (c) 2006-2010 Vienna University of Technology,
* Department of Software Technology and Interactive Systems
*
* All rights reserved. This program and the accompanying
* materials are made available under the terms of the
* Apache License, Version 2.0 which accompanies
* this distribution, and is available at
* http://www.apache.org/licenses/LICENSE-2.0
*******************************************************************************/
package at.tuwien.minimee.migration;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;

import org.apache.commons.logging.Log;

import at.tuwien.minimee.ActionService;
import at.tuwien.minimee.migration.engines.IMigrationEngine;
import at.tuwien.minimee.migration.evaluators.IMinimeeEvaluator;
import at.tuwien.minimee.model.ToolConfig;
import at.tuwien.minimee.registry.ToolRegistry;
import eu.planets_project.pp.plato.model.measurement.Measurement;
import eu.planets_project.pp.plato.services.action.MigrationResult;
import eu.planets_project.pp.plato.util.OS;
import eu.planets_project.pp.plato.util.PlatoLogger;
/**
* Currently not exposed as a web service since miniMEE has been integrated
* with Plato.
* @author cb
*/
public class MigrationService extends ActionService {
    Log log = PlatoLogger.getLogger(this.getClass());
    private HashMap<String, ToolConfig> tools = ToolRegistry.getInstance().getAllToolConfigs();

    //private static String tempDir = System.getProperty("java.io.tmpdir").replace('\\', '/');

    /**
     * This is a public client feedback mechanism.
     * With each migration service returning, the client gets a ONETIMEPAD key
     * that can be used ONCE for adding a Measurement to the ToolExperience
     * (one measurement only at the moment ;)
     */
    public boolean addExperience(long otp,String toolID, Measurement measurement) {
        return ToolRegistry.getInstance().addExperience(otp, ToolRegistry.getToolKey(toolID), measurement);
    }
   
    public static byte[] getBytesFromFile(File file) throws IOException {
        InputStream is = new FileInputStream(file);
   
        // Get the size of the file
        long length = file.length();
   
        if (length > Integer.MAX_VALUE) {
            // File is too large
        }
   
        // Create the byte array to hold the data
        byte[] bytes = new byte[(int)length];
   
        // Read in the bytes
        int offset = 0;
        int numRead = 0;
        while (offset < bytes.length
               && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
            offset += numRead;
        }
   
        // Ensure all the bytes have been read in
        if (offset < bytes.length) {
            throw new IOException("Could not completely read file "+file.getName());
        }
   
        // Close the input stream and return bytes
        is.close();
        return bytes;
    }
   

    /**
     * THIS is the real one. Currently not exposed as a web service since miniMEE
     * has been integrated with Plato.
     * @param data
     * @param toolID
     * @param params
     * @return
     */
    public MigrationResult migrate(byte[] data, String toolID, String params) {
        ToolConfig config = getToolConfig(toolID);
        ToolRegistry reg = ToolRegistry.getInstance();

        IMigrationEngine engine = reg.getAllEngines().get(config.getEngine());
        MigrationResult r= engine.migrate(data, toolID, params);

        /* evaluate result */
        evaluate(config, data, r);
       
        long key = System.nanoTime();
        r.setFeedbackKey(key);
        reg.addTimePad(key);
        return r;
    }
   
    public MigrationResult migrate(byte[] data, String toolID) {
        return migrate(data, toolID,null);
    }
   
    protected void evaluate(ToolConfig config, byte[] data, MigrationResult result) {
        if (!result.isSuccessful() || !result.getMigratedObject().isDataExistent()) {
            return;
        }
        long time = System.nanoTime();

        // get tempdir
        String tempDir = OS.getTmpPath();
      
        // prepare inputfile
        String inputFile = tempDir + "in" + time;
        // SPECIAL STUFF, UNLIKELY TO REMAIN HERE:
        if (config.getInEnding() != null && !"".equals(config.getInEnding())) {
            inputFile = inputFile+"."+config.getInEnding();
        }
        OutputStream in;
        try {
            in = new  BufferedOutputStream (new FileOutputStream(inputFile));
            in.write(data);
            in.close();
        } catch (FileNotFoundException e) {
            log.error(e);
        } catch (IOException e) {
            log.error(e);
        }
        // prepare outputfile
        String outputFile = tempDir + "out" + time + ((config.getOutEnding()==null)?"":"."+config.getOutEnding());
        try {
            in = new  BufferedOutputStream (new FileOutputStream(outputFile));
            in.write(result.getMigratedObject().getData().getData());
            in.close();
        } catch (FileNotFoundException e) {
            log.error(e);
        } catch (IOException e) {
            log.error(e);
        }
        try {
            for (String evaluatorName: config.getEvaluators()) {
                IMinimeeEvaluator evaluator = ToolRegistry.getInstance().getEvaluator(evaluatorName);
                if (evaluator == null) {
                    log.error("Error in ToolConfig, could not find evaluator: " + evaluatorName);
                } else {
                    if (evaluator != null) {
                        List<Measurement> list = evaluator.evaluate(tempDir,
                                inputFile,
                                outputFile);
                        for (Measurement m: list) {
                            result.getMeasurements().put(m.getProperty().getName(), m);
                        }
                    }
                }
            }
        } finally {
            new File(inputFile).delete();
            new File(outputFile).delete();
        }
    }
   
}
TOP

Related Classes of at.tuwien.minimee.migration.MigrationService

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.