changeset 415:ce8e19567911

make LuanPropertyMeta a singleton
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 30 Apr 2015 06:04:17 -0600
parents d2ab2240cc65
children 91af5337b9ae
files core/src/luan/LuanMeta.java core/src/luan/LuanPropertyMeta.java core/src/luan/modules/TableLuan.java lucene/src/luan/modules/lucene/FieldTable.java web/src/luan/modules/web/HttpServicer.java
diffstat 5 files changed, 40 insertions(+), 57 deletions(-) [+]
line wrap: on
line diff
diff -r d2ab2240cc65 -r ce8e19567911 core/src/luan/LuanMeta.java
--- a/core/src/luan/LuanMeta.java	Wed Apr 29 19:06:18 2015 -0600
+++ b/core/src/luan/LuanMeta.java	Thu Apr 30 06:04:17 2015 -0600
@@ -10,12 +10,12 @@
 
 	public abstract Object __index(LuanState luan,LuanTable tbl,Object key) throws LuanException;
 
-	protected abstract Iterator keys();
+	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.iterator();
-			final Iterator<Object> iter2 = keys();
+			final Iterator<Object> iter2 = keys(tbl);
 			final Set<Object> set = new HashSet<Object>();
 
 			@Override public Object[] call(LuanState luan,Object[] args) throws LuanException {
diff -r d2ab2240cc65 -r ce8e19567911 core/src/luan/LuanPropertyMeta.java
--- a/core/src/luan/LuanPropertyMeta.java	Wed Apr 29 19:06:18 2015 -0600
+++ b/core/src/luan/LuanPropertyMeta.java	Thu Apr 30 06:04:17 2015 -0600
@@ -4,38 +4,21 @@
 import java.util.Iterator;
 
 
-public final class LuanPropertyMeta extends LuanMeta implements DeepCloneable<LuanPropertyMeta> {
-	private LuanTable getters;
-	private LuanTable setters;
+public final class LuanPropertyMeta extends LuanMeta {
+	public static final LuanPropertyMeta INSTANCE = new LuanPropertyMeta();
 
 	private LuanPropertyMeta() {}
 
-	public static LuanPropertyMeta newInstance() {
-		LuanPropertyMeta meta = new LuanPropertyMeta();
-		meta.getters = new LuanTable();
-		meta.setters = new LuanTable();
-		return meta;
-	}
-
-	public LuanTable getters() {
-		return getters;
+	public LuanTable getters(LuanTable tbl) {
+		return (LuanTable)tbl.getMetatable().get("get");
 	}
 
-	public LuanTable setters() {
-		return setters;
-	}
-
-	@Override public LuanPropertyMeta shallowClone() {
-		return new LuanPropertyMeta();
-	}
-
-	@Override public void deepenClone(LuanPropertyMeta clone,DeepCloner cloner) {
-		clone.getters = cloner.get(getters);
-		clone.setters = cloner.get(setters);
+	public LuanTable setters(LuanTable tbl) {
+		return (LuanTable)tbl.getMetatable().get("set");
 	}
 
 	@Override public Object __index(LuanState luan,LuanTable tbl,Object key) throws LuanException {
-		Object obj = getters.get(key);
+		Object obj = getters(tbl).get(key);
 		if( obj == null )
 			return null;
 		if( !(obj instanceof LuanFunction) )
@@ -44,9 +27,9 @@
 		return luan.call(fn);
 	}
 
-	@Override protected Iterator keys() {
+	@Override protected Iterator keys(final LuanTable tbl) {
 		return new Iterator() {
-			final Iterator<Map.Entry<Object,Object>> iter = getters.iterator();
+			final Iterator<Map.Entry<Object,Object>> iter = getters(tbl).iterator();
 
 			@Override public boolean hasNext() {
 				return iter.hasNext();
@@ -66,7 +49,7 @@
 	}
 
 	@Override public void __newindex(LuanState luan,LuanTable tbl,Object key,Object value) throws LuanException {
-		Object obj = setters.get(key);
+		Object obj = setters(tbl).get(key);
 		if( obj == null )
 			throw luan.exception("can't set property '"+key+"'");
 		if( !(obj instanceof LuanFunction) )
@@ -77,8 +60,8 @@
 
 	@Override public LuanTable newMetatable() {
 		LuanTable mt = super.newMetatable();
-		mt.put( "get", getters );
-		mt.put( "set", setters );
+		mt.put( "get", new LuanTable() );
+		mt.put( "set", new LuanTable() );
 		return mt;
 	}
 
diff -r d2ab2240cc65 -r ce8e19567911 core/src/luan/modules/TableLuan.java
--- a/core/src/luan/modules/TableLuan.java	Wed Apr 29 19:06:18 2015 -0600
+++ b/core/src/luan/modules/TableLuan.java	Thu Apr 30 06:04:17 2015 -0600
@@ -116,6 +116,6 @@
 	}
 
 	public static LuanTable new_property_table() {
-		return LuanPropertyMeta.newInstance().newTable();
+		return LuanPropertyMeta.INSTANCE.newTable();
 	}
 }
diff -r d2ab2240cc65 -r ce8e19567911 lucene/src/luan/modules/lucene/FieldTable.java
--- a/lucene/src/luan/modules/lucene/FieldTable.java	Wed Apr 29 19:06:18 2015 -0600
+++ b/lucene/src/luan/modules/lucene/FieldTable.java	Thu Apr 30 06:04:17 2015 -0600
@@ -53,7 +53,7 @@
 		return map.get(key);
 	}
 
-	@Override public final Iterator keys() {
+	@Override public final Iterator keys(LuanTable tbl) {
 		return map.keySet().iterator();
 	}
 /*
diff -r d2ab2240cc65 -r ce8e19567911 web/src/luan/modules/web/HttpServicer.java
--- a/web/src/luan/modules/web/HttpServicer.java	Wed Apr 29 19:06:18 2015 -0600
+++ b/web/src/luan/modules/web/HttpServicer.java	Thu Apr 30 06:04:17 2015 -0600
@@ -119,8 +119,8 @@
 	}
 
 	private LuanTable requestTable() throws NoSuchMethodException {
-		LuanPropertyMeta meta = LuanPropertyMeta.newInstance();
-		LuanTable tbl = meta.newTable();
+		LuanTable tbl = LuanPropertyMeta.INSTANCE.newTable();
+		LuanTable getters = LuanPropertyMeta.INSTANCE.getters(tbl);
 		tbl.put("java",request);
 		LuanTable parameters = new NameMeta() {
 
@@ -128,7 +128,7 @@
 				return request.getParameter(name);
 			}
 
-			@Override protected Iterator keys() {
+			@Override protected Iterator keys(LuanTable tbl) {
 				return new EnumerationIterator(request.getParameterNames());
 			}
 /*
@@ -145,7 +145,7 @@
 				return request.getHeader(name);
 			}
 
-			@Override protected Iterator keys() {
+			@Override protected Iterator keys(LuanTable tbl) {
 				return new EnumerationIterator(request.getHeaderNames());
 			}
 /*
@@ -155,22 +155,22 @@
 */
 		}.newTable();
 		tbl.put( "headers", headers );
-		meta.getters().put( "method", new LuanJavaFunction(
+		getters.put( "method", new LuanJavaFunction(
 			HttpServletRequest.class.getMethod( "getMethod" ), request
 		) );
-		meta.getters().put( "path", new LuanJavaFunction(
+		getters.put( "path", new LuanJavaFunction(
 			HttpServletRequest.class.getMethod( "getRequestURI" ), request
 		) );
-		meta.getters().put( "server_name", new LuanJavaFunction(
+		getters.put( "server_name", new LuanJavaFunction(
 			HttpServletRequest.class.getMethod( "getServerName" ), request
 		) );
-		meta.getters().put( "url", new LuanJavaFunction(
+		getters.put( "url", new LuanJavaFunction(
 			HttpServicer.class.getMethod( "getURL" ), this
 		) );
-		meta.getters().put( "query_string", new LuanJavaFunction(
+		getters.put( "query_string", new LuanJavaFunction(
 			HttpServicer.class.getMethod( "getQueryString" ), this
 		) );
-		meta.getters().put( "remote_address", new LuanJavaFunction(
+		getters.put( "remote_address", new LuanJavaFunction(
 			HttpServletRequest.class.getMethod( "getRemoteAddr" ), request
 		) );
 		LuanTable cookies = new LuanMeta() {
@@ -182,7 +182,7 @@
 				return getCookieValue(request,name);
 			}
 
-			@Override protected Iterator<Object> keys() {
+			@Override protected Iterator<Object> keys(LuanTable tbl) {
 				return new Iterator<Object>() {
 					final Cookie[] cookies = request.getCookies();
 					int i = 0;
@@ -222,11 +222,10 @@
 					if( filename == null ) {
 						value = new String(part.getBytes());
 					} else {
-						LuanPropertyMeta partMeta = LuanPropertyMeta.newInstance();
-						LuanTable partTbl = partMeta.newTable();
+						LuanTable partTbl = LuanPropertyMeta.INSTANCE.newTable();
 						partTbl.put("filename",filename);
 						partTbl.put("content_type",part.getContentType());
-						partMeta.getters().put( "content", new LuanFunction() {
+						LuanPropertyMeta.INSTANCE.getters(partTbl).put( "content", new LuanFunction() {
 							@Override public Object call(LuanState luan,Object[] args) throws LuanException {
 								try {
 									InputStream in = part.getInputStream();
@@ -271,8 +270,9 @@
 	}
 
 	private LuanTable responseTable() throws NoSuchMethodException {
-		LuanPropertyMeta meta = LuanPropertyMeta.newInstance();
-		LuanTable tbl = meta.newTable();
+		LuanTable tbl = LuanPropertyMeta.INSTANCE.newTable();
+		LuanTable getters = LuanPropertyMeta.INSTANCE.getters(tbl);
+		LuanTable setters = LuanPropertyMeta.INSTANCE.setters(tbl);
 		tbl.put("java",response);
 		add( tbl, "send_redirect", String.class );
 		add( tbl, "send_error", Integer.TYPE, String.class );
@@ -282,7 +282,7 @@
 				return response.getHeader(name);
 			}
 
-			@Override protected Iterator keys() {
+			@Override protected Iterator keys(LuanTable tbl) {
 				return response.getHeaderNames().iterator();
 			}
 
@@ -312,25 +312,25 @@
 */
 		}.newTable();
 		tbl.put( "headers", headers );
-		meta.getters().put( "content_type", new LuanJavaFunction(
+		getters.put( "content_type", new LuanJavaFunction(
 			HttpServletResponse.class.getMethod( "getContentType" ), response
 		) );
-		meta.setters().put( "content_type", new LuanJavaFunction(
+		setters.put( "content_type", new LuanJavaFunction(
 			HttpServletResponse.class.getMethod( "setContentType", String.class ), response
 		) );
-		meta.getters().put( "character_encoding", new LuanJavaFunction(
+		getters.put( "character_encoding", new LuanJavaFunction(
 			HttpServletResponse.class.getMethod( "getCharacterEncoding" ), response
 		) );
-		meta.setters().put( "character_encoding", new LuanJavaFunction(
+		setters.put( "character_encoding", new LuanJavaFunction(
 			HttpServletResponse.class.getMethod( "setCharacterEncoding", String.class ), response
 		) );
 		add( tbl, "text_writer" );
 		add( tbl, "set_cookie", String.class, String.class, Boolean.TYPE, String.class );
 		add( tbl, "remove_cookie", String.class, String.class );
-		meta.getters().put( "status", new LuanJavaFunction(
+		getters.put( "status", new LuanJavaFunction(
 			HttpServletResponse.class.getMethod( "getStatus" ), response
 		) );
-		meta.setters().put( "status", new LuanJavaFunction(
+		setters.put( "status", new LuanJavaFunction(
 			HttpServletResponse.class.getMethod( "setStatus", Integer.TYPE ), response
 		) );
 		return tbl;
@@ -344,7 +344,7 @@
 				return request.getSession().getAttribute(name);
 			}
 
-			@Override protected Iterator keys() {
+			@Override protected Iterator keys(LuanTable tbl) {
 				return new EnumerationIterator(request.getSession().getAttributeNames());
 			}