You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@manifoldcf.apache.org by kw...@apache.org on 2011/08/21 19:10:22 UTC
svn commit: r1160012 [1/2] - in /incubator/lcf/trunk/framework: ./
core/src/main/java/org/apache/manifoldcf/core/interfaces/
script-engine/src/main/java/org/apache/manifoldcf/scriptengine/
Author: kwright
Date: Sun Aug 21 17:10:20 2011
New Revision: 1160012
URL: http://svn.apache.org/viewvc?rev=1160012&view=rev
Log:
Get script engine working in an (almost complete) manner.
Added:
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/BasicTokenStream.java
- copied, changed from r1158857, incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/TokenStream.java
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/BreakCommand.java (with props)
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/CharacterStream.java (with props)
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/Command.java (with props)
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/ContextVariableReference.java (with props)
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/DELETECommand.java (with props)
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/GETCommand.java (with props)
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/IfCommand.java (with props)
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NullVariableReference.java (with props)
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/POSTCommand.java (with props)
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/PUTCommand.java (with props)
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/PrintCommand.java (with props)
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/RewindableTokenStream.java (with props)
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/SetCommand.java (with props)
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableBoolean.java (with props)
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableFloat.java (with props)
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableResult.java (with props)
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/WhileCommand.java (with props)
Removed:
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/Position.java
Modified:
incubator/lcf/trunk/framework/build.xml
incubator/lcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/Configuration.java
incubator/lcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ConfigurationNode.java
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/ScriptParser.java
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/Token.java
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/TokenStream.java
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/Variable.java
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableBase.java
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableConfiguration.java
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableConfigurationNode.java
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableInt.java
incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableReference.java
Modified: incubator/lcf/trunk/framework/build.xml
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/framework/build.xml?rev=1160012&r1=1160011&r2=1160012&view=diff
==============================================================================
--- incubator/lcf/trunk/framework/build.xml (original)
+++ incubator/lcf/trunk/framework/build.xml Sun Aug 21 17:10:20 2011
@@ -393,11 +393,13 @@
<include name="commons-httpclient-mcf.jar"/>
<include name="commons-io*.jar"/>
<include name="commons-logging*.jar"/>
+ <include name="json.jar"/>
</fileset>
</copy>
- <copy todir="dist/example/lib">
+ <copy todir="dist/script-engine/lib">
<fileset dir="build/jar">
<include name="mcf-core.jar"/>
+ <include name="mcf-script-engine.jar"/>
</fileset>
</copy>
</target>
@@ -590,6 +592,16 @@
</junit>
</target>
+ <target name="run-script-engine" depends="script-engine">
+ <java classname="org.apache.manifoldcf.scriptengine.ScriptParser" fork="true" dir="dist/script-engine" maxmemory="128M">
+ <classpath>
+ <fileset dir="dist/script-engine/lib">
+ <include name="*.jar"/>
+ </fileset>
+ </classpath>
+ </java>
+ </target>
+
<target name="build" depends="processes,war-authority-service,war-crawler-ui,war-api-service,example,script-engine"/>
<target name="all" depends="build,doc,build-tests,run-tests,run-tests-postgresql"/>
Modified: incubator/lcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/Configuration.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/Configuration.java?rev=1160012&r1=1160011&r2=1160012&view=diff
==============================================================================
--- incubator/lcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/Configuration.java (original)
+++ incubator/lcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/Configuration.java Sun Aug 21 17:10:20 2011
@@ -778,4 +778,23 @@ public class Configuration implements IH
return true;
}
+ /** Construct a human-readable string */
+ public String toString()
+ {
+ StringBuilder sb = new StringBuilder();
+ sb.append("[");
+ if (children != null)
+ {
+ int i = 0;
+ while (i < children.size())
+ {
+ if (i > 0)
+ sb.append(", ");
+ ConfigurationNode cn = children.get(i++);
+ sb.append(cn.toString());
+ }
+ }
+ sb.append("]");
+ return sb.toString();
+ }
}
Modified: incubator/lcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ConfigurationNode.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ConfigurationNode.java?rev=1160012&r1=1160011&r2=1160012&view=diff
==============================================================================
--- incubator/lcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ConfigurationNode.java (original)
+++ incubator/lcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ConfigurationNode.java Sun Aug 21 17:10:20 2011
@@ -345,6 +345,41 @@ public class ConfigurationNode implement
}
return true;
}
+
+ /** Construct a human-readable string */
+ public String toString()
+ {
+ StringBuilder sb = new StringBuilder();
+ sb.append("(");
+ sb.append(type);
+ if (value != null)
+ sb.append(":").append(value);
+ if (attributes != null)
+ {
+ Iterator<String> iter = attributes.keySet().iterator();
+ while (iter.hasNext())
+ {
+ sb.append(" ");
+ String key = iter.next();
+ String attrValue = attributes.get(key);
+ sb.append(key).append("='").append(attrValue).append("'");
+ }
+ }
+ sb.append(" [");
+ if (children != null)
+ {
+ int i = 0;
+ while (i < children.size())
+ {
+ if (i > 0)
+ sb.append(", ");
+ ConfigurationNode cn = children.get(i++);
+ sb.append(cn.toString());
+ }
+ }
+ sb.append("])");
+ return sb.toString();
+ }
protected static Map<String,String> cloneAttributes(Map<String,String> attributes)
{
Copied: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/BasicTokenStream.java (from r1158857, incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/TokenStream.java)
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/BasicTokenStream.java?p2=incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/BasicTokenStream.java&p1=incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/TokenStream.java&r1=1158857&r2=1160012&rev=1160012&view=diff
==============================================================================
--- incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/TokenStream.java (original)
+++ incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/BasicTokenStream.java Sun Aug 21 17:10:20 2011
@@ -19,33 +19,22 @@
package org.apache.manifoldcf.scriptengine;
-/** Convert a script into a stream of tokens.
+import java.io.*;
+
+/** Convert a sequence of characters into a stream of tokens.
*/
-public class TokenStream
+public class BasicTokenStream implements TokenStream
{
- protected String fileName;
- protected String code;
- protected int characterPosition = 0;
+ protected CharacterStream characterStream;
protected Token currentToken = null;
- public TokenStream(String fileName, String code)
- {
- this.fileName = fileName;
- this.code = code;
- }
-
- public int getCharacterPosition()
+ public BasicTokenStream(Reader reader)
{
- return characterPosition;
- }
-
- public void setCharacterPosition(int characterPosition)
- {
- this.characterPosition = characterPosition;
- currentToken = null;
+ this.characterStream = new CharacterStream(reader);
}
public Token peek()
+ throws ScriptException
{
if (currentToken == null)
currentToken = parseNextToken();
@@ -57,40 +46,46 @@ public class TokenStream
currentToken = null;
}
- public String getFileName()
- {
- return fileName;
- }
-
// Protected methods
protected Token parseNextToken()
+ throws ScriptException
{
+ char y;
+ int lineNumber;
+ int characterNumber;
+
// Skip to the start of the next token (or exit if no token start can be found)
while (true)
{
+
// Skip white space
- while (characterPosition < code.length())
+ while (true)
{
- char x = code.charAt(characterPosition);
- if (x > ' ')
+ // Remember current position so we can properly characterize the token.
+ lineNumber = characterStream.getLineNumber();
+ characterNumber = characterStream.getCharacterNumber();
+ int x = characterStream.peek();
+ if (x == -1)
+ return null;
+ y = (char)x;
+ if (y > ' ')
break;
- characterPosition++;
+ characterStream.skip();
}
-
- // End of text?
- if (characterPosition == code.length())
- return null;
-
+
// Is it a comment?
- char y = code.charAt(characterPosition);
if (y == '#')
{
// Skip to the end of the line, or the end of the text.
- while (characterPosition < code.length())
+ while (true)
{
- char x = code.charAt(characterPosition++);
- if (x == '\n')
+ int x = characterStream.peek();
+ if (x == -1)
+ return null;
+ characterStream.skip();
+ y = (char)x;
+ if (y == '\n')
break;
}
continue;
@@ -99,67 +94,127 @@ public class TokenStream
}
// At the start of the next token.
- // Figure out what kind of token it is. Currently we only care about punctuation
- // and strings. Furthermore, no distinction is made between quoted and unquoted
- // strings.
- char z = code.charAt(characterPosition);
- if (isLegalTokenCharacter(z))
+ if (isQuoteCharacter(y))
{
// Legal token character
StringBuilder tokenBuffer = new StringBuilder();
- int quoteMark = -1;
- while (characterPosition < code.length())
+ char quoteMark = y;
+ characterStream.skip();
+ while (true)
{
- char x = code.charAt(characterPosition);
- if (quoteMark == -1)
+ int x = characterStream.peek();
+ if (x == -1)
+ break;
+ y = (char)x;
+ characterStream.skip();
+ if (y == quoteMark)
+ // End of the quotation
+ break;
+ if (y == '\\')
{
- // Not yet in a quote
- if (x <= ' ' || x == '#')
- break;
- if (x == '\'' || x == '"')
+ // Escape character
+ x = characterStream.peek();
+ if (x != -1)
{
- characterPosition++;
- quoteMark = (int)x;
+ tokenBuffer.append((char)x);
+ characterStream.skip();
}
- else if (isLegalTokenCharacter(x))
- {
- characterPosition++;
- tokenBuffer.append(x);
- }
- else
- break;
}
else
+ tokenBuffer.append(y);
+ }
+ return new Token(Token.TOKEN_STRING,tokenBuffer.toString(),lineNumber,characterNumber);
+ }
+ else if (isTokenCharacter(y))
+ {
+ // Legal token character
+ StringBuilder tokenBuffer = new StringBuilder();
+ while (true)
+ {
+ int x = characterStream.peek();
+ if (x == -1)
+ break;
+ y = (char)x;
+ if (isTokenCharacter(y) || isNumberCharacter(y))
{
- characterPosition++;
- // In a quote.
- if (((int)x) == quoteMark)
- // End of the quotation
- break;
- if (x == '\\')
- {
- // Escape character
- if (characterPosition < code.length())
- tokenBuffer.append(code.charAt(characterPosition++));
- }
- else
- tokenBuffer.append(x);
+ // Tokens can include numbers, just so long they aren't the first character
+ characterStream.skip();
+ tokenBuffer.append(y);
}
+ else
+ break;
}
- return new Token(Token.TOKEN_STRING,tokenBuffer.toString());
+ return new Token(Token.TOKEN_TOKEN,tokenBuffer.toString(),lineNumber,characterNumber);
+ }
+ else if (isNumberCharacter(y))
+ {
+ StringBuilder tokenBuffer = new StringBuilder();
+ boolean seenDot = false;
+ while (true)
+ {
+ int x = characterStream.peek();
+ if (x == -1)
+ break;
+ y = (char)x;
+ if (isNumberCharacter(y))
+ {
+ tokenBuffer.append(y);
+ characterStream.skip();
+ }
+ else if (y == '.' && seenDot == false)
+ {
+ tokenBuffer.append(y);
+ seenDot = true;
+ characterStream.skip();
+ }
+ else
+ break;
+ }
+ if (seenDot)
+ return new Token(Token.TOKEN_FLOAT,tokenBuffer.toString(),lineNumber,characterNumber);
+ else
+ return new Token(Token.TOKEN_INTEGER,tokenBuffer.toString(),lineNumber,characterNumber);
}
else
{
// Set a punctuation token
- characterPosition++;
- return new Token(Token.TOKEN_PUNCTUATION,new StringBuilder(z).toString());
+ characterStream.skip();
+ if (y == '=' || y == '!' || y == '>' || y == '<' || y == '&' || y == '|')
+ {
+ int x = characterStream.peek();
+ if (x != -1)
+ {
+ char q = (char)x;
+ if (y == '=' && q == '=' ||
+ y == '!' && q == '=' ||
+ y == '>' && q == '=' ||
+ y == '<' && q == '=' ||
+ y == '&' && q == '&' ||
+ y == '|' && q == '|')
+ {
+ characterStream.skip();
+ return new Token(Token.TOKEN_PUNCTUATION,new StringBuilder().append(y).append(q).toString(),
+ lineNumber,characterNumber);
+ }
+ }
+ }
+ return new Token(Token.TOKEN_PUNCTUATION,new StringBuilder().append(y).toString(),
+ lineNumber,characterNumber);
}
}
- protected static boolean isLegalTokenCharacter(char x)
+ protected static boolean isQuoteCharacter(char x)
+ {
+ return (x == '\'' || x == '"');
+ }
+
+ protected static boolean isNumberCharacter(char x)
+ {
+ return (x >= '0' && x <= '9');
+ }
+
+ protected static boolean isTokenCharacter(char x)
{
- if (x >= '0' && x <= '9')
- return true;
if (x >= 'a' && x <= 'z')
return true;
if (x >= 'A' && x <='Z')
Added: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/BreakCommand.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/BreakCommand.java?rev=1160012&view=auto
==============================================================================
--- incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/BreakCommand.java (added)
+++ incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/BreakCommand.java Sun Aug 21 17:10:20 2011
@@ -0,0 +1,44 @@
+/* $Id$ */
+
+/**
+* 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.manifoldcf.scriptengine;
+
+/** Break command. */
+public class BreakCommand implements Command
+{
+ /** Parse and execute. Parsing begins right after the command name, and should stop before the trailing semicolon.
+ *@param sp is the script parser to use to help in the parsing.
+ *@param currentStream is the current token stream.
+ *@return true to send a break signal, false otherwise.
+ */
+ public boolean parseAndExecute(ScriptParser sp, TokenStream currentStream)
+ throws ScriptException
+ {
+ return true;
+ }
+
+ /** Parse and skip. Parsing begins right after the command name, and should stop before the trailing semicolon.
+ *@param sp is the script parser to use to help in the parsing.
+ *@param currentStream is the current token stream.
+ */
+ public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
+ throws ScriptException
+ {
+ }
+
+}
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/BreakCommand.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/BreakCommand.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/CharacterStream.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/CharacterStream.java?rev=1160012&view=auto
==============================================================================
--- incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/CharacterStream.java (added)
+++ incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/CharacterStream.java Sun Aug 21 17:10:20 2011
@@ -0,0 +1,93 @@
+/* $Id$ */
+
+/**
+* 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.manifoldcf.scriptengine;
+
+import java.io.*;
+
+/** Convert a Reader into a sequence of characters, while keeping track of line
+* endings.
+*/
+public class CharacterStream
+{
+ protected Reader reader;
+ protected int currentCharacter = -1;
+ protected int lineNumber = 0;
+ protected int characterNumber = 0;
+
+ public CharacterStream(Reader reader)
+ {
+ this.reader = reader;
+ }
+
+ public int peek()
+ throws ScriptException
+ {
+ if (currentCharacter == -1)
+ currentCharacter = readNextCharacter();
+ return currentCharacter;
+ }
+
+ public void skip()
+ {
+ currentCharacter = -1;
+ }
+
+ public int getLineNumber()
+ {
+ return lineNumber;
+ }
+
+ public int getCharacterNumber()
+ {
+ return characterNumber;
+ }
+
+ // Protected methods
+
+ protected int readNextCharacter()
+ throws ScriptException
+ {
+ if (reader == null)
+ return -1;
+
+ try
+ {
+ int rval = reader.read();
+ if (rval == -1)
+ {
+ reader.close();
+ reader = null;
+ return -1;
+ }
+ characterNumber++;
+ if (((char)rval) == '\n')
+ {
+ lineNumber++;
+ characterNumber = 0;
+ }
+ return rval;
+ }
+ catch (IOException e)
+ {
+ throw new ScriptException("I/O exception: "+e.getMessage(),e);
+ }
+ }
+
+}
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/CharacterStream.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/CharacterStream.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/Command.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/Command.java?rev=1160012&view=auto
==============================================================================
--- incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/Command.java (added)
+++ incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/Command.java Sun Aug 21 17:10:20 2011
@@ -0,0 +1,41 @@
+/* $Id$ */
+
+/**
+* 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.manifoldcf.scriptengine;
+
+/** Interface describing what a command needs to do.
+*/
+public interface Command
+{
+ /** Parse and execute. Parsing begins right after the command name, and should stop before the trailing semicolon.
+ *@param sp is the script parser to use to help in the parsing.
+ *@param currentStream is the current token stream.
+ *@return true to send a break signal, false otherwise.
+ */
+ public boolean parseAndExecute(ScriptParser sp, TokenStream currentStream)
+ throws ScriptException;
+
+ /** Parse and skip. Parsing begins right after the command name, and should stop before the trailing semicolon.
+ *@param sp is the script parser to use to help in the parsing.
+ *@param currentStream is the current token stream.
+ */
+ public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
+ throws ScriptException;
+
+}
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/Command.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/Command.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/ContextVariableReference.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/ContextVariableReference.java?rev=1160012&view=auto
==============================================================================
--- incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/ContextVariableReference.java (added)
+++ incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/ContextVariableReference.java Sun Aug 21 17:10:20 2011
@@ -0,0 +1,48 @@
+/* $Id$ */
+
+/**
+* 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.manifoldcf.scriptengine;
+
+/** Overwritable variable references from within a context.
+*/
+public class ContextVariableReference implements VariableReference
+{
+ protected Variable variable = null;
+
+ public ContextVariableReference()
+ {
+ }
+
+ /** Set the reference */
+ public void setReference(Variable object)
+ throws ScriptException
+ {
+ variable = object;
+ }
+
+ /** Resolve the reference */
+ public Variable resolve()
+ throws ScriptException
+ {
+ if (variable == null)
+ throw new ScriptException("Attempt to dereference null variable pointer");
+ return variable;
+ }
+
+}
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/ContextVariableReference.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/ContextVariableReference.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/DELETECommand.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/DELETECommand.java?rev=1160012&view=auto
==============================================================================
--- incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/DELETECommand.java (added)
+++ incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/DELETECommand.java Sun Aug 21 17:10:20 2011
@@ -0,0 +1,88 @@
+/* $Id$ */
+
+/**
+* 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.manifoldcf.scriptengine;
+
+import org.apache.commons.httpclient.*;
+import org.apache.commons.httpclient.methods.*;
+import java.io.*;
+
+/** DELETE command. This performs a REST-style DELETE operation, designed to work
+* against the ManifoldCF API. The syntax is: DELETE resultvariable = urlvariable */
+public class DELETECommand implements Command
+{
+ /** Parse and execute. Parsing begins right after the command name, and should stop before the trailing semicolon.
+ *@param sp is the script parser to use to help in the parsing.
+ *@param currentStream is the current token stream.
+ *@return true to send a break signal, false otherwise.
+ */
+ public boolean parseAndExecute(ScriptParser sp, TokenStream currentStream)
+ throws ScriptException
+ {
+ VariableReference result = sp.evaluateExpression(currentStream);
+ if (result == null)
+ sp.syntaxError(currentStream,"Missing result expression");
+ Token t = currentStream.peek();
+ if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("="))
+ sp.syntaxError(currentStream,"Missing '=' sign");
+ currentStream.skip();
+ VariableReference url = sp.evaluateExpression(currentStream);
+ if (url == null)
+ sp.syntaxError(currentStream,"Missing URL expression");
+
+ // Perform the actual GET.
+ String urlString = url.resolve().getStringValue();
+
+ try
+ {
+ HttpClient client = new HttpClient();
+ DeleteMethod method = new DeleteMethod(urlString);
+ int resultCode = client.executeMethod(method);
+ byte[] responseData = method.getResponseBody();
+ // We presume that the data is utf-8, since that's what the API
+ // uses throughout.
+ String resultJSON = new String(responseData,"utf-8");
+
+ result.setReference(new VariableResult(resultCode,resultJSON));
+
+ return false;
+ }
+ catch (IOException e)
+ {
+ throw new ScriptException(e.getMessage(),e);
+ }
+ }
+
+ /** Parse and skip. Parsing begins right after the command name, and should stop before the trailing semicolon.
+ *@param sp is the script parser to use to help in the parsing.
+ *@param currentStream is the current token stream.
+ */
+ public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
+ throws ScriptException
+ {
+ if (sp.skipExpression(currentStream) == false)
+ sp.syntaxError(currentStream,"Missing result expression");
+ Token t = currentStream.peek();
+ if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("="))
+ sp.syntaxError(currentStream,"Missing '=' sign");
+ currentStream.skip();
+ if (sp.skipExpression(currentStream) == false)
+ sp.syntaxError(currentStream,"Missing URL expression");
+ }
+
+}
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/DELETECommand.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/DELETECommand.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/GETCommand.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/GETCommand.java?rev=1160012&view=auto
==============================================================================
--- incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/GETCommand.java (added)
+++ incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/GETCommand.java Sun Aug 21 17:10:20 2011
@@ -0,0 +1,88 @@
+/* $Id$ */
+
+/**
+* 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.manifoldcf.scriptengine;
+
+import org.apache.commons.httpclient.*;
+import org.apache.commons.httpclient.methods.*;
+import java.io.*;
+
+/** GET command. This performs a REST-style GET operation, designed to work
+* against the ManifoldCF API. The syntax is: GET resultvariable = urlvariable */
+public class GETCommand implements Command
+{
+ /** Parse and execute. Parsing begins right after the command name, and should stop before the trailing semicolon.
+ *@param sp is the script parser to use to help in the parsing.
+ *@param currentStream is the current token stream.
+ *@return true to send a break signal, false otherwise.
+ */
+ public boolean parseAndExecute(ScriptParser sp, TokenStream currentStream)
+ throws ScriptException
+ {
+ VariableReference result = sp.evaluateExpression(currentStream);
+ if (result == null)
+ sp.syntaxError(currentStream,"Missing result expression");
+ Token t = currentStream.peek();
+ if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("="))
+ sp.syntaxError(currentStream,"Missing '=' sign");
+ currentStream.skip();
+ VariableReference url = sp.evaluateExpression(currentStream);
+ if (url == null)
+ sp.syntaxError(currentStream,"Missing URL expression");
+
+ // Perform the actual GET.
+ String urlString = url.resolve().getStringValue();
+
+ try
+ {
+ HttpClient client = new HttpClient();
+ GetMethod method = new GetMethod(urlString);
+ int resultCode = client.executeMethod(method);
+ byte[] responseData = method.getResponseBody();
+ // We presume that the data is utf-8, since that's what the API
+ // uses throughout.
+ String resultJSON = new String(responseData,"utf-8");
+
+ result.setReference(new VariableResult(resultCode,resultJSON));
+
+ return false;
+ }
+ catch (IOException e)
+ {
+ throw new ScriptException(e.getMessage(),e);
+ }
+ }
+
+ /** Parse and skip. Parsing begins right after the command name, and should stop before the trailing semicolon.
+ *@param sp is the script parser to use to help in the parsing.
+ *@param currentStream is the current token stream.
+ */
+ public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
+ throws ScriptException
+ {
+ if (sp.skipExpression(currentStream) == false)
+ sp.syntaxError(currentStream,"Missing result expression");
+ Token t = currentStream.peek();
+ if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("="))
+ sp.syntaxError(currentStream,"Missing '=' sign");
+ currentStream.skip();
+ if (sp.skipExpression(currentStream) == false)
+ sp.syntaxError(currentStream,"Missing URL expression");
+ }
+
+}
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/GETCommand.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/GETCommand.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/IfCommand.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/IfCommand.java?rev=1160012&view=auto
==============================================================================
--- incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/IfCommand.java (added)
+++ incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/IfCommand.java Sun Aug 21 17:10:20 2011
@@ -0,0 +1,88 @@
+/* $Id$ */
+
+/**
+* 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.manifoldcf.scriptengine;
+
+/** If command. */
+public class IfCommand implements Command
+{
+ /** Parse and execute. Parsing begins right after the command name, and should stop before the trailing semicolon.
+ *@param sp is the script parser to use to help in the parsing.
+ *@param currentStream is the current token stream.
+ *@return true to send a break signal, false otherwise.
+ */
+ public boolean parseAndExecute(ScriptParser sp, TokenStream currentStream)
+ throws ScriptException
+ {
+ boolean rval = false;
+ VariableReference ifCondition = sp.evaluateExpression(currentStream);
+ if (ifCondition == null)
+ sp.syntaxError(currentStream,"Missing if expression");
+ Token t = currentStream.peek();
+ if (t == null || t.getToken() == null || !t.getToken().equals("then"))
+ sp.syntaxError(currentStream,"Missing 'then' in if statement");
+ currentStream.skip();
+ if (ifCondition.resolve().getBooleanValue())
+ {
+ rval = sp.parseStatements(currentStream);
+ t = currentStream.peek();
+ if (t != null &&t.getToken().equals("else"))
+ {
+ currentStream.skip();
+ // Skip statements
+ sp.skipStatements(currentStream);
+ }
+ }
+ else
+ {
+ sp.skipStatements(currentStream);
+ t = currentStream.peek();
+ if (t != null && t.getToken().equals("else"))
+ {
+ currentStream.skip();
+ // Parse statements
+ rval = sp.parseStatements(currentStream);
+ }
+ }
+ return rval;
+ }
+
+ /** Parse and skip. Parsing begins right after the command name, and should stop before the trailing semicolon.
+ *@param sp is the script parser to use to help in the parsing.
+ *@param currentStream is the current token stream.
+ */
+ public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
+ throws ScriptException
+ {
+ if (sp.skipExpression(currentStream) == false)
+ sp.syntaxError(currentStream,"Missing if expression");
+ Token t = currentStream.peek();
+ if (t == null || t.getToken() == null || !t.getToken().equals("then"))
+ sp.syntaxError(currentStream,"Missing 'then' in if statement");
+ currentStream.skip();
+ sp.skipStatements(currentStream);
+ t = currentStream.peek();
+ if (t != null &&t.getToken().equals("else"))
+ {
+ currentStream.skip();
+ // Skip statements
+ sp.skipStatements(currentStream);
+ }
+ }
+
+}
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/IfCommand.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/IfCommand.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NullVariableReference.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NullVariableReference.java?rev=1160012&view=auto
==============================================================================
--- incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NullVariableReference.java (added)
+++ incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NullVariableReference.java Sun Aug 21 17:10:20 2011
@@ -0,0 +1,44 @@
+/* $Id$ */
+
+/**
+* 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.manifoldcf.scriptengine;
+
+/** Null variable reference.
+*/
+public class NullVariableReference implements VariableReference
+{
+ public NullVariableReference()
+ {
+ }
+
+ /** Set the reference */
+ public void setReference(Variable object)
+ throws ScriptException
+ {
+ throw new ScriptException("Null reference is immutable");
+ }
+
+ /** Resolve the reference */
+ public Variable resolve()
+ throws ScriptException
+ {
+ throw new ScriptException("Attempt to dereference null variable pointer");
+ }
+
+}
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NullVariableReference.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NullVariableReference.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/POSTCommand.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/POSTCommand.java?rev=1160012&view=auto
==============================================================================
--- incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/POSTCommand.java (added)
+++ incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/POSTCommand.java Sun Aug 21 17:10:20 2011
@@ -0,0 +1,104 @@
+/* $Id$ */
+
+/**
+* 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.manifoldcf.scriptengine;
+
+import org.apache.commons.httpclient.*;
+import org.apache.commons.httpclient.methods.*;
+import java.io.*;
+
+/** POST command. This performs a REST-style POST operation, designed to work
+* against the ManifoldCF API. The syntax is: POST resultvariable = sendvariable to urlvariable*/
+public class POSTCommand implements Command
+{
+ /** Parse and execute. Parsing begins right after the command name, and should stop before the trailing semicolon.
+ *@param sp is the script parser to use to help in the parsing.
+ *@param currentStream is the current token stream.
+ *@return true to send a break signal, false otherwise.
+ */
+ public boolean parseAndExecute(ScriptParser sp, TokenStream currentStream)
+ throws ScriptException
+ {
+ VariableReference result = sp.evaluateExpression(currentStream);
+ if (result == null)
+ sp.syntaxError(currentStream,"Missing result expression");
+ Token t = currentStream.peek();
+ if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("="))
+ sp.syntaxError(currentStream,"Missing '=' sign");
+ currentStream.skip();
+ VariableReference send = sp.evaluateExpression(currentStream);
+ if (send == null)
+ sp.syntaxError(currentStream,"Missing send expression");
+ t = currentStream.peek();
+ if (t == null || t.getToken() == null || !t.getToken().equals("to"))
+ sp.syntaxError(currentStream,"Missing 'to'");
+ currentStream.skip();
+ VariableReference url = sp.evaluateExpression(currentStream);
+ if (url == null)
+ sp.syntaxError(currentStream,"Missing URL expression");
+
+ // Perform the actual PUT.
+ String urlString = url.resolve().getStringValue();
+ String json = send.resolve().getJSONValue();
+
+ try
+ {
+ HttpClient client = new HttpClient();
+ PostMethod method = new PostMethod(urlString);
+ method.setRequestHeader("Content-type", "text/plain; charset=UTF-8");
+ method.setRequestBody(json);
+ int resultCode = client.executeMethod(method);
+ byte[] responseData = method.getResponseBody();
+ // We presume that the data is utf-8, since that's what the API
+ // uses throughout.
+ String resultJSON = new String(responseData,"utf-8");
+
+ result.setReference(new VariableResult(resultCode,resultJSON));
+
+ return false;
+ }
+ catch (IOException e)
+ {
+ throw new ScriptException(e.getMessage(),e);
+ }
+ }
+
+ /** Parse and skip. Parsing begins right after the command name, and should stop before the trailing semicolon.
+ *@param sp is the script parser to use to help in the parsing.
+ *@param currentStream is the current token stream.
+ */
+ public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
+ throws ScriptException
+ {
+ if (sp.skipExpression(currentStream) == false)
+ sp.syntaxError(currentStream,"Missing result expression");
+ Token t = currentStream.peek();
+ if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("="))
+ sp.syntaxError(currentStream,"Missing '=' sign");
+ currentStream.skip();
+ if (sp.skipExpression(currentStream) == false)
+ sp.syntaxError(currentStream,"Missing send expression");
+ t = currentStream.peek();
+ if (t == null || t.getToken() == null || !t.getToken().equals("to"))
+ sp.syntaxError(currentStream,"Missing 'to'");
+ currentStream.skip();
+ if (sp.skipExpression(currentStream) == false)
+ sp.syntaxError(currentStream,"Missing URL expression");
+ }
+
+}
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/POSTCommand.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/POSTCommand.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/PUTCommand.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/PUTCommand.java?rev=1160012&view=auto
==============================================================================
--- incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/PUTCommand.java (added)
+++ incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/PUTCommand.java Sun Aug 21 17:10:20 2011
@@ -0,0 +1,104 @@
+/* $Id$ */
+
+/**
+* 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.manifoldcf.scriptengine;
+
+import org.apache.commons.httpclient.*;
+import org.apache.commons.httpclient.methods.*;
+import java.io.*;
+
+/** PUT command. This performs a REST-style PUT operation, designed to work
+* against the ManifoldCF API. The syntax is: PUT resultvariable = sendvariable to urlvariable*/
+public class PUTCommand implements Command
+{
+ /** Parse and execute. Parsing begins right after the command name, and should stop before the trailing semicolon.
+ *@param sp is the script parser to use to help in the parsing.
+ *@param currentStream is the current token stream.
+ *@return true to send a break signal, false otherwise.
+ */
+ public boolean parseAndExecute(ScriptParser sp, TokenStream currentStream)
+ throws ScriptException
+ {
+ VariableReference result = sp.evaluateExpression(currentStream);
+ if (result == null)
+ sp.syntaxError(currentStream,"Missing result expression");
+ Token t = currentStream.peek();
+ if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("="))
+ sp.syntaxError(currentStream,"Missing '=' sign");
+ currentStream.skip();
+ VariableReference send = sp.evaluateExpression(currentStream);
+ if (send == null)
+ sp.syntaxError(currentStream,"Missing send expression");
+ t = currentStream.peek();
+ if (t == null || t.getToken() == null || !t.getToken().equals("to"))
+ sp.syntaxError(currentStream,"Missing 'to'");
+ currentStream.skip();
+ VariableReference url = sp.evaluateExpression(currentStream);
+ if (url == null)
+ sp.syntaxError(currentStream,"Missing URL expression");
+
+ // Perform the actual PUT.
+ String urlString = url.resolve().getStringValue();
+ String json = send.resolve().getJSONValue();
+
+ try
+ {
+ HttpClient client = new HttpClient();
+ PutMethod method = new PutMethod(urlString);
+ method.setRequestHeader("Content-type", "text/plain; charset=UTF-8");
+ method.setRequestBody(json);
+ int resultCode = client.executeMethod(method);
+ byte[] responseData = method.getResponseBody();
+ // We presume that the data is utf-8, since that's what the API
+ // uses throughout.
+ String resultJSON = new String(responseData,"utf-8");
+
+ result.setReference(new VariableResult(resultCode,resultJSON));
+
+ return false;
+ }
+ catch (IOException e)
+ {
+ throw new ScriptException(e.getMessage(),e);
+ }
+ }
+
+ /** Parse and skip. Parsing begins right after the command name, and should stop before the trailing semicolon.
+ *@param sp is the script parser to use to help in the parsing.
+ *@param currentStream is the current token stream.
+ */
+ public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
+ throws ScriptException
+ {
+ if (sp.skipExpression(currentStream) == false)
+ sp.syntaxError(currentStream,"Missing result expression");
+ Token t = currentStream.peek();
+ if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("="))
+ sp.syntaxError(currentStream,"Missing '=' sign");
+ currentStream.skip();
+ if (sp.skipExpression(currentStream) == false)
+ sp.syntaxError(currentStream,"Missing send expression");
+ t = currentStream.peek();
+ if (t == null || t.getToken() == null || !t.getToken().equals("to"))
+ sp.syntaxError(currentStream,"Missing 'to'");
+ currentStream.skip();
+ if (sp.skipExpression(currentStream) == false)
+ sp.syntaxError(currentStream,"Missing URL expression");
+ }
+
+}
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/PUTCommand.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/PUTCommand.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/PrintCommand.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/PrintCommand.java?rev=1160012&view=auto
==============================================================================
--- incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/PrintCommand.java (added)
+++ incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/PrintCommand.java Sun Aug 21 17:10:20 2011
@@ -0,0 +1,50 @@
+/* $Id$ */
+
+/**
+* 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.manifoldcf.scriptengine;
+
+/** Print command. */
+public class PrintCommand implements Command
+{
+ /** Parse and execute. Parsing begins right after the command name, and should stop before the trailing semicolon.
+ *@param sp is the script parser to use to help in the parsing.
+ *@param currentStream is the current token stream.
+ *@return true to send a break signal, false otherwise.
+ */
+ public boolean parseAndExecute(ScriptParser sp, TokenStream currentStream)
+ throws ScriptException
+ {
+ VariableReference expr = sp.evaluateExpression(currentStream);
+ if (expr == null)
+ sp.syntaxError(currentStream,"Missing print expression");
+ System.out.println(expr.resolve().getStringValue());
+ return false;
+ }
+
+ /** Parse and skip. Parsing begins right after the command name, and should stop before the trailing semicolon.
+ *@param sp is the script parser to use to help in the parsing.
+ *@param currentStream is the current token stream.
+ */
+ public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
+ throws ScriptException
+ {
+ if (sp.skipExpression(currentStream) == false)
+ sp.syntaxError(currentStream,"Missing print expression");
+ }
+
+}
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/PrintCommand.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/PrintCommand.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/RewindableTokenStream.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/RewindableTokenStream.java?rev=1160012&view=auto
==============================================================================
--- incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/RewindableTokenStream.java (added)
+++ incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/RewindableTokenStream.java Sun Aug 21 17:10:20 2011
@@ -0,0 +1,65 @@
+/* $Id$ */
+
+/**
+* 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.manifoldcf.scriptengine;
+
+import java.util.*;
+
+/** Allows a TokenStream to be repeated as long as a sequence start is kept.
+*/
+public class RewindableTokenStream implements TokenStream
+{
+ protected TokenStream parent;
+ protected List<Token> history = new ArrayList<Token>();
+ protected int currentIndex = 0;
+ protected int committedSize = 0;
+
+ public RewindableTokenStream(TokenStream parent)
+ {
+ this.parent = parent;
+ }
+
+ public Token peek()
+ throws ScriptException
+ {
+ if (history.size() > currentIndex)
+ return history.get(currentIndex);
+ Token rval = parent.peek();
+ history.add(rval);
+ return rval;
+ }
+
+ public void skip()
+ {
+ currentIndex++;
+ if (currentIndex > committedSize)
+ {
+ parent.skip();
+ committedSize++;
+ }
+ if (currentIndex > committedSize)
+ throw new RuntimeException("Two skips in a row!");
+ }
+
+ public void reset()
+ {
+ currentIndex = 0;
+ }
+
+}
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/RewindableTokenStream.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/lcf/trunk/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/RewindableTokenStream.java
------------------------------------------------------------------------------
svn:keywords = Id