/* * Copyright (c) 1998-2011 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * Free SoftwareFoundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */ package com.caucho.es; import com.caucho.util.IntMap; import java.util.Iterator; import java.util.regex.Pattern; public class ESRegexp extends ESObject { static ESId GLOBAL = ESId.intern("global"); static ESId IGNORE_CASE = ESId.intern("ignoreCase"); static ESId LAST_INDEX = ESId.intern("lastIndex"); static ESId SOURCE = ESId.intern("source"); ESString pattern; ESString flags; Pattern _regexp; boolean hasSetProps; int lastIndex; ESString lastString; int lastStart; ESRegexp(ESString pattern, ESString flags) throws ESException { super("RegExp", getPrototype()); this.pattern = pattern; this.flags = flags; lastString = ESString.NULL; /* java.util.regex try { _regexp = Pattern.parse(pattern.toString(), flags.toString()); } catch (Exception e) { throw new ESException("regexp: " + e.getMessage()); } */ } public ESRegexp(String pattern, String flags) throws ESException { super("RegExp", getPrototype()); this.pattern = new ESString(pattern); this.flags = new ESString(flags); lastString = ESString.NULL; try { _regexp = Pattern.compile(pattern); // , flags } catch (Exception e) { throw new ESException("regexp: " + e.getMessage()); } } protected ESRegexp() {} private static ESBase getPrototype() { Global resin = Global.getGlobalProto(); if (resin == null) return null; else return resin.getRegexpProto(); } private void setProps() { if (hasSetProps) return; int flags = READ_ONLY|DONT_DELETE; hasSetProps = true; // java.util.regex // put(GLOBAL, ESBoolean.create(_regexp.isGlobal())); // , flags); // put(IGNORE_CASE, ESBoolean.create(_regexp.ignoreCase())); // , flags); put(LAST_INDEX, ESNumber.create(lastIndex), DONT_DELETE); put(SOURCE, pattern, flags); } int getLastIndex() throws Throwable { if (! hasSetProps) return lastIndex; else return getProperty(LAST_INDEX).toInt32(); } void setLastIndex(int index) { lastIndex = index; hasSetProps = false; } public ESBase getProperty(ESString key) throws Throwable { if (! hasSetProps) setProps(); return super.getProperty(key); } public void setProperty(ESString key, ESBase value) throws Throwable { if (! hasSetProps) setProps(); super.setProperty(key, value); } public ESBase delete(ESString key) throws Throwable { if (! hasSetProps) setProps(); return super.delete(key); } public Iterator keys() throws ESException { if (! hasSetProps) setProps(); return super.keys(); } public ESString toSource(IntMap map, boolean isLoopPass) throws Throwable { if (isLoopPass) return null; else return toStr(); } void compile(ESString pattern, ESString flags) throws ESException { if (! this.pattern.equals(pattern) || ! this.flags.equals(flags)) { this.pattern = pattern; this.flags = flags; try { // XXX: java.util.regex // _regexp = Pattern.parse(pattern.toString(), flags.toString()); } catch (Exception e) { throw new ESException("regexp: " + e); } } lastIndex = 0; hasSetProps = false; } boolean exec(ESString string, boolean useGlobal) throws Throwable { return false; /* change to java.util.regex lastString = string; lastStart = getLastIndex(); if (! useGlobal) { lastStart = 0; return _regexp.match(string.toString()); } else if (regexp.match(string.toString(), lastStart)) { hasSetProps = false; lastIndex = 0; return false; } else { hasSetProps = false; lastIndex = regexp.getEnd(0); if (regexp.getBegin(0) == lastIndex) lastIndex++; return true; } */ } public Object toJavaObject() { // java.util.regex // return regexp; return null; } boolean exec(ESString string) throws Throwable { return false; // java.util.regex // return exec(string, regexp.isGlobal()); } public ESBase call(Call call, int length) throws Throwable { call.setThis(this); return NativeRegexp.exec(call, length); } protected ESObject dup() { return new ESRegexp(); } protected void copy(Object newObj) { ESRegexp newRegexp = (ESRegexp) newObj; super.copy(newObj); newRegexp.pattern = pattern; newRegexp.flags = flags; newRegexp.lastString = lastString; // XXX: bogus try { // java.util.regex // newRegexp.regexp = new Regexp(pattern.toString(), flags.toString()); } catch (Exception e) { } } }