package utils
import org.groovymud.utils.WordUtils
/**
* Copyright 2008 Matthew Corby-Eaglen
*
* Licensed 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.
*/
import org.groovymud.object.MudObject
import org.groovymud.object.Container
import static org.groovymud.utils.WordUtils.*
/**
* helps find the objects based on regexp matches.
* set the objectName and index and it will look for the object in a hashset or a container
* @author matt
*
*/
class MatchedObject{
String foundNames = "" // used for storing a list of found object names
String objectName = "" // the parsed object name
int index = 0
static final def allMatcher = /^(all$|all .*$)/
boolean all(){
def val = (this.objectName ==~ allMatcher)
return val
}
static final def pluralMatcher = /^.+s$/
static final def collectiveMatcher = /^.+ of .+s$/
boolean plural(){
return (this.objectName ==~ pluralMatcher) && !(this.objectName ==~ collectiveMatcher)
}
// finds the object in a container, returns a Map if all is set or was plural
// otherwise returns the object
protected def findObjectInContainer(container){
def wasAll = false
def objs = null;
if(objectName == "all"){
objs = container.getMudObjects()
wasAll = true
}
if(objs == null){
if(all()){
objectName = objectName.minus("all")
wasAll = true
}
objs = getObject(objectName, container)
boolean plural = plural()
if(plural &&(objs?.size() == 0 || objs == null)){
objectName = depluralize(objectName)
objs = getObject(objectName, container)
wasAll = true
}
}
if(wasAll || objs == null){
return objs
}
return objs.asList().toArray()[index - 1]
}
private def getObject(objectName, container){
def objs = null
if(objectName == ""){
objs = container.getMudObject();
}else{
objs = container.getMudObjects(objectName)
}
return objs
}
/**
* finds the object in a given hashset, returns a HashSet if all is set
* collates a list of object names otherwise returns the object
*/
public def findObjectIn(HashSet set){
def ret = [] as HashSet
set.each{
prospectiveContainer ->
if(prospectiveContainer.respondsTo("getMudObjects")){
def found = findObjectInContainer(prospectiveContainer);
if(found instanceof HashSet){
found.eachWithIndex{
obj, idx ->
foundNames +=
affixIndefiniteArticle(obj) +
(idx < found.size() - 1 ? ", " : "") +
(idx == found.size() - 1 ? " and " : "")
}
ret.addAll(found)
}else{
foundNames = affixIndefinateArticle(found)
ret.add(found)
}
}
}
if(all()){
return ret
}
return ret.asList().toArray()[index]
}
}