| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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 org.apache.axis2.scripting; |
| |
| import org.apache.bsf.BSFEngine; |
| import org.apache.bsf.BSFException; |
| import org.apache.bsf.BSFManager; |
| |
| import java.io.File; |
| import java.io.FileReader; |
| import java.io.IOException; |
| import java.io.Reader; |
| |
| public class ScriptInvoker { |
| |
| protected File scriptFile; |
| |
| protected long lastModified; |
| |
| protected long lastCheckTime; |
| |
| protected int hotUpdateInterval; |
| |
| protected BSFEngine engine; |
| |
| private String scriptName; |
| |
| public ScriptInvoker(File scriptFile, int hotUpdateInterval) { |
| this.scriptFile = scriptFile; |
| this.hotUpdateInterval = hotUpdateInterval; |
| this.scriptName = scriptFile.getName(); |
| initEngine(); |
| } |
| |
| public Object invoke(String functionName, Object[] args) { |
| |
| if (hotUpdateInterval > 0) { |
| checkUpdate(); |
| } |
| |
| try { |
| engine.call(null, functionName, args); |
| } catch (BSFException e) { |
| throw new RuntimeException(e); |
| } |
| |
| return null; |
| } |
| |
| protected synchronized void checkUpdate() { |
| long now = System.currentTimeMillis(); |
| if (now - lastCheckTime > hotUpdateInterval) { |
| lastCheckTime = now; |
| long lm = scriptFile.lastModified(); |
| if (lm != lastModified) { |
| lastModified = lm; |
| initEngine(); |
| } |
| } |
| } |
| |
| protected void initEngine() { |
| try { |
| |
| String scriptLanguage = BSFManager.getLangFromFilename(scriptName); |
| BSFManager bsfManager = new BSFManager(); |
| bsfManager.setClassLoader(BSFManager.class.getClassLoader()); |
| // bsfManager.declareBean("_AxisService", axisService, |
| // AxisService.class); |
| |
| BSFEngine bsfEngine = bsfManager |
| .loadScriptingEngine(scriptLanguage); |
| Object scriptSrc = readScript(); |
| bsfEngine.exec(scriptName, 0, 0, scriptSrc); |
| |
| } catch (BSFException e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| /** |
| * Reads the complete script source code into a String |
| */ |
| protected String readScript() { |
| Reader reader = null; |
| try { |
| |
| reader = new FileReader(scriptFile); |
| char[] buffer = new char[1024]; |
| StringBuffer source = new StringBuffer(); |
| int count; |
| while ((count = reader.read(buffer)) > 0) { |
| source.append(buffer, 0, count); |
| } |
| |
| return source.toString(); |
| |
| } catch (IOException e) { |
| throw new RuntimeException("IOException reading script: " |
| + scriptName, e); |
| } finally { |
| try { |
| if (reader != null) { |
| reader.close(); |
| } |
| } catch (IOException e) { |
| throw new RuntimeException("IOException closing script: " |
| + scriptName, e); |
| } |
| } |
| } |
| } |