changeset 796:6b8ea0a9b7c9

remove LuanMeta
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 05 Sep 2016 19:52:49 -0600
parents dd36eae6aa04
children 86e477945676
files src/luan/LuanMeta.java src/luan/LuanPropertyMeta.java src/luan/LuanTable.java src/luan/modules/Table.luan src/luan/modules/TableLuan.java src/luan/modules/http/HttpServicer.java src/luan/modules/lucene/Lucene.luan src/luan/modules/lucene/LuceneIndex.java
diffstat 8 files changed, 49 insertions(+), 171 deletions(-) [+]
line wrap: on
line diff
--- a/src/luan/LuanMeta.java	Mon Sep 05 16:32:55 2016 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,69 +0,0 @@
-package luan;
-
-import java.util.Map;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.HashSet;
-
-
-public abstract class LuanMeta {
-
-	public abstract Object __index(LuanState luan,LuanTable tbl,Object key) throws LuanException;
-
-	protected abstract Iterator keys(LuanTable tbl);
-
-	public LuanFunction __pairs(final LuanState luan,final LuanTable tbl) {
-		return new LuanFunction() {
-			final Iterator<Map.Entry<Object,Object>> iter1 = tbl.rawIterator();
-			final Iterator<Object> iter2 = keys(tbl);
-			final Set<Object> set = new HashSet<Object>();
-
-			@Override public Object[] call(LuanState luan,Object[] args) throws LuanException {
-				if( iter1.hasNext() ) {
-					Map.Entry<Object,Object> entry = iter1.next();
-					Object key = entry.getKey();
-					set.add(key);
-					return new Object[]{key,entry.getValue()};
-				}
-				while( iter2.hasNext() ) {
-					Object key = iter2.next();
-					if( set.add(key) ) {
-						Object value = __index(luan,tbl,key);
-						return new Object[]{key,value};
-					}
-				}
-				return LuanFunction.NOTHING;
-			}
-		};
-	}
-
-	public boolean canNewindex() {
-		return false;
-	}
-
-	public void __new_index(LuanState luan,LuanTable tbl,Object key,Object value) throws LuanException {
-		throw new UnsupportedOperationException();
-	}
-
-	protected abstract String type(LuanTable tbl);
-
-	public String __to_string(LuanState luan,LuanTable tbl) throws LuanException {
-		return type(tbl) + "-" + tbl.rawToString();
-	}
-
-	public LuanTable newMetatable() {
-		LuanTable mt = new LuanTable();
-		mt.rawPut( "__index", this );
-		mt.rawPut( "__pairs", this );
-		mt.rawPut( "__to_string", this );
-		if( canNewindex() )
-			mt.rawPut( "__new_index", this );
-		return mt;
-	}
-
-	public LuanTable newTable() {
-		LuanTable tbl = new LuanTable();
-		tbl.setMetatable( newMetatable() );
-		return tbl;
-	}
-}
--- a/src/luan/LuanPropertyMeta.java	Mon Sep 05 16:32:55 2016 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-package luan;
-
-import java.util.Map;
-import java.util.Iterator;
-
-
-public final class LuanPropertyMeta extends LuanMeta {
-	public static final LuanPropertyMeta INSTANCE = new LuanPropertyMeta();
-
-	private LuanPropertyMeta() {}
-
-	public LuanTable getters(LuanTable tbl) {
-		return (LuanTable)tbl.getMetatable().rawGet("get");
-	}
-
-	public LuanTable setters(LuanTable tbl) {
-		return (LuanTable)tbl.getMetatable().rawGet("set");
-	}
-
-	protected String type(LuanTable tbl) {
-		return (String)tbl.getMetatable().rawGet("type");
-	}
-
-	@Override public Object __index(LuanState luan,LuanTable tbl,Object key) throws LuanException {
-		Object obj = getters(tbl).rawGet(key);
-		if( obj == null )
-			return null;
-		if( !(obj instanceof LuanFunction) )
-			throw new LuanException("get for '"+key+"' isn't a function");
-		LuanFunction fn = (LuanFunction)obj;
-		return fn.call(luan);
-	}
-
-	@Override protected Iterator keys(final LuanTable tbl) {
-		return new Iterator() {
-			final Iterator<Map.Entry<Object,Object>> iter = getters(tbl).rawIterator();
-
-			@Override public boolean hasNext() {
-				return iter.hasNext();
-			}
-			@Override public Object next() {
-				return iter.next().getKey();
-			}
-			@Override public void remove() {
-				throw new UnsupportedOperationException();
-			}
-		};
-	}
-
-
-	@Override public boolean canNewindex() {
-		return true;
-	}
-
-	@Override public void __new_index(LuanState luan,LuanTable tbl,Object key,Object value) throws LuanException {
-		Object obj = setters(tbl).rawGet(key);
-		if( obj == null ) {
-			tbl.rawPut(key,value);
-			return;
-		}
-		if( !(obj instanceof LuanFunction) )
-			throw new LuanException("set for '"+key+"' isn't a function");
-		LuanFunction fn = (LuanFunction)obj;
-		fn.call(luan,new Object[]{value});
-	}
-
-	@Override public LuanTable newMetatable() {
-		LuanTable mt = super.newMetatable();
-		mt.rawPut( "get", new LuanTable() );
-		mt.rawPut( "set", new LuanTable() );
-		mt.rawPut( "type", "property" );
-		return mt;
-	}
-
-}
--- a/src/luan/LuanTable.java	Mon Sep 05 16:32:55 2016 -0600
+++ b/src/luan/LuanTable.java	Mon Sep 05 19:52:49 2016 -0600
@@ -117,10 +117,6 @@
 		Object h = getHandler("__to_string");
 		if( h == null )
 			return rawToString();
-		if( h instanceof LuanMeta ) {
-			LuanMeta meta = (LuanMeta)h;
-			return meta.__to_string(luan,this);
-		}
 		LuanFunction fn = Luan.checkFunction(h);
 		return Luan.checkString( Luan.first( fn.call(luan,new Object[]{this}) ) );
 	}
@@ -140,10 +136,6 @@
 			LuanFunction fn = (LuanFunction)h;
 			return Luan.first(fn.call(luan,new Object[]{this,key}));
 		}
-		if( h instanceof LuanMeta ) {
-			LuanMeta meta = (LuanMeta)h;
-			return meta.__index(luan,this,key);
-		}
 		return luan.index(h,key);
 	}
 
@@ -177,11 +169,6 @@
 			fn.call(luan,new Object[]{this,key,value});
 			return;
 		}
-		if( h instanceof LuanMeta ) {
-			LuanMeta meta = (LuanMeta)h;
-			meta.__new_index(luan,this,key,value);
-			return;
-		}
 		if( h instanceof LuanTable ) {
 			LuanTable tbl = (LuanTable)h;
 			tbl.put(luan,key,value);
@@ -354,10 +341,6 @@
 					throw new LuanException( "metamethod __pairs should return function but returned " + Luan.type(obj) );
 				return (LuanFunction)obj;
 			}
-			if( h instanceof LuanMeta ) {
-				LuanMeta meta = (LuanMeta)h;
-				return meta.__pairs(luan,this);
-			}
 			throw new LuanException( "invalid type of metamethod __pairs: " + Luan.type(h) );
 		}
 		return rawPairs();
--- a/src/luan/modules/Table.luan	Mon Sep 05 16:32:55 2016 -0600
+++ b/src/luan/modules/Table.luan	Mon Sep 05 19:52:49 2016 -0600
@@ -7,7 +7,6 @@
 M.concat = TableLuan.concat
 M.copy = TableLuan.copy
 M.insert = TableLuan.insert
-M.new_property_table = TableLuan.new_property_table
 M.pack = TableLuan.pack
 M.remove = TableLuan.remove
 M.sort = TableLuan.sort
--- a/src/luan/modules/TableLuan.java	Mon Sep 05 16:32:55 2016 -0600
+++ b/src/luan/modules/TableLuan.java	Mon Sep 05 19:52:49 2016 -0600
@@ -11,7 +11,6 @@
 import luan.LuanException;
 import luan.LuanRuntimeException;
 import luan.LuanMethod;
-import luan.LuanPropertyMeta;
 
 
 public final class TableLuan {
@@ -109,10 +108,6 @@
 		return list.rawSubList(from,to);
 	}
 
-	public static LuanTable new_property_table() {
-		return LuanPropertyMeta.INSTANCE.newTable();
-	}
-
 	public static void clear(LuanTable tbl) {
 		tbl.rawClear();
 	}
--- a/src/luan/modules/http/HttpServicer.java	Mon Sep 05 16:32:55 2016 -0600
+++ b/src/luan/modules/http/HttpServicer.java	Mon Sep 05 19:52:49 2016 -0600
@@ -28,7 +28,7 @@
 import luan.LuanFunction;
 import luan.LuanException;
 import luan.LuanTable;
-import luan.LuanPropertyMeta;
+//import luan.LuanPropertyMeta;
 import luan.LuanCloner;
 import luan.modules.PackageLuan;
 import luan.modules.IoLuan;
@@ -126,6 +126,7 @@
 					if( filename == null ) {
 						value = new String(part.getBytes());
 					} else {
+/*
 						LuanTable partTbl = LuanPropertyMeta.INSTANCE.newTable();
 						partTbl.rawPut("filename",filename);
 						partTbl.rawPut("content_type",part.getContentType());
@@ -141,6 +142,28 @@
 								}
 							}
 						} );
+*/
+						LuanTable partTbl = new LuanTable();
+						partTbl.rawPut("filename",filename);
+						partTbl.rawPut("content_type",part.getContentType());
+						LuanTable mt = new LuanTable();
+						partTbl.setMetatable(mt);
+						mt.rawPut( "__index", new LuanFunction() {
+							@Override public Object call(LuanState luan,Object[] args) throws LuanException {
+								Object key = args[1];
+								if( "content".equals(key) ) {
+									try {
+										InputStream in = part.getInputStream();
+										byte[] content = Utils.readAll(in);
+										in.close();
+										return content;
+									} catch(IOException e) {
+										throw new RuntimeException(e);
+									}
+								}
+								return null;
+							}
+						} );
 						value = partTbl;
 					}
 					LuanTable list = (LuanTable)parametersTbl.rawGet(name);
--- a/src/luan/modules/lucene/Lucene.luan	Mon Sep 05 16:32:55 2016 -0600
+++ b/src/luan/modules/lucene/Lucene.luan	Mon Sep 05 19:52:49 2016 -0600
@@ -3,6 +3,7 @@
 local error = Luan.error
 local ipairs = Luan.ipairs or error()
 local type = Luan.type or error()
+local set_metatable = Luan.set_metatable or error()
 local Html = require "luan:Html.luan"
 local Io = require "luan:Io.luan"
 local uri = Io.uri or error()
@@ -36,7 +37,17 @@
 	local index = {}
 	index.dir = index_dir
 	local java_index = LuceneIndex.new(index_dir,default_type,default_fields)
-	index.indexed_fields = java_index.indexedFieldsMeta.newTable()
+--	index.indexed_fields = java_index.indexedFieldsMeta.newTable()
+
+	index.indexed_fields = {}
+	local mt = {}
+	set_metatable(index.indexed_fields,mt)
+	function mt.__index(_,key)
+		return java_index.getIndexedFieldParser(key)
+	end
+	function mt.__new_index(_,key,value)
+		return java_index.setIndexedFieldParser(key,value)
+	end
 
 	-- index.indexed_only_fields[type][field] = fn(doc)
 	index.indexed_only_fields = java_index.indexed_only_fields
--- a/src/luan/modules/lucene/LuceneIndex.java	Mon Sep 05 16:32:55 2016 -0600
+++ b/src/luan/modules/lucene/LuceneIndex.java	Mon Sep 05 19:52:49 2016 -0600
@@ -71,7 +71,7 @@
 import luan.LuanTable;
 import luan.LuanFunction;
 import luan.LuanException;
-import luan.LuanMeta;
+//import luan.LuanMeta;
 import luan.LuanRuntimeException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -456,7 +456,7 @@
 	}
 
 
-
+/*
 	public final LuanMeta indexedFieldsMeta = new LuanMeta() {
 
 		@Override public boolean canNewindex() {
@@ -490,7 +490,18 @@
 		}
 
 	};
+*/
+	public FieldParser getIndexedFieldParser(String field) {
+		return mfp.fields.get(field);
+	}
 
+	public void setIndexedFieldParser(String field,FieldParser fp) {
+		if( fp==null ) {  // delete
+			mfp.fields.remove(field);
+			return;
+		}
+		mfp.fields.put( field, fp );
+	}
 
 
 	private IndexableField newField(String name,Object value,Field.Store store,Set<String> indexed)