/**
* Copyright (c) 2014-2017 by the respective copyright holders.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.smarthome.transform.javascript.internal;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.io.Reader;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import org.apache.commons.io.IOUtils;
import org.eclipse.smarthome.config.core.ConfigConstants;
import org.eclipse.smarthome.core.transform.TransformationException;
import org.eclipse.smarthome.core.transform.TransformationService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* The implementation of {@link TransformationService} which transforms the
* input by Java Script.
*
* @author Pauli Anttila
*/
public class JavaScriptTransformationService implements TransformationService {
/**
* Transforms the input <code>source</code> by Java Script. It expects the
* transformation rule to be read from a file which is stored under the
* 'configurations/transform' folder. To organize the various
* transformations one should use subfolders.
*
* @param filename
* the name of the file which contains the Java script
* transformation rule. Transformation service inject input
* (source) to 'input' variable.
* @param source
* the input to transform
*/
@Override
public String transform(String filename, String source) throws TransformationException {
Logger logger = LoggerFactory.getLogger(JavaScriptTransformationService.class);
if (filename == null || source == null) {
throw new TransformationException("the given parameters 'filename' and 'source' must not be null");
}
logger.debug("about to transform '{}' by the Java Script '{}'", source, filename);
Reader reader;
try {
String path = ConfigConstants.getConfigFolder() + File.separator
+ TransformationService.TRANSFORM_FOLDER_NAME + File.separator + filename;
reader = new InputStreamReader(new FileInputStream(path));
} catch (FileNotFoundException e) {
throw new TransformationException("An error occurred while loading script.", e);
}
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
engine.put("input", source);
Object result = null;
long startTime = System.currentTimeMillis();
try {
result = engine.eval(reader);
} catch (ScriptException e) {
throw new TransformationException("An error occurred while executing script.", e);
} finally {
IOUtils.closeQuietly(reader);
}
logger.trace("JavaScript execution elapsed {} ms", System.currentTimeMillis() - startTime);
return String.valueOf(result);
}
}