blob: ca40e69750ba35957b5c0db4b2574cc6aebaf7b1 [file] [log] [blame]
/* $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.manifoldcf.core.interfaces.*;
/** Variable wrapper for Configuration object.
*/
public class VariableConfiguration extends VariableBase
{
protected Configuration configuration;
public VariableConfiguration()
{
configuration = new Configuration();
}
public VariableConfiguration(Configuration c)
{
configuration = c;
}
public VariableConfiguration(String json)
throws ScriptException
{
configuration = new Configuration();
if (json != null && json.length() > 0)
{
try
{
configuration.fromJSON(json);
}
catch (ManifoldCFException e)
{
throw new ScriptException("Invalid json: '"+json+"': "+e.getMessage(),e);
}
}
}
/** Check if the variable has a script value */
@Override
public boolean hasScriptValue()
throws ScriptException
{
return true;
}
/** Get the variable's script value */
@Override
public String getScriptValue()
throws ScriptException
{
StringBuilder sb = new StringBuilder();
sb.append("{ ");
int i = 0;
while (i < configuration.getChildCount())
{
if (i > 0)
sb.append(", ");
ConfigurationNode child = configuration.findChild(i++);
sb.append(new VariableConfigurationNode(child).getScriptValue());
}
sb.append(" }");
return sb.toString();
}
/** Check if the variable has a Configuration value */
@Override
public boolean hasConfigurationValue()
throws ScriptException
{
return true;
}
/** Get the variable's value as a Configuration object */
@Override
public Configuration getConfigurationValue()
throws ScriptException
{
return configuration;
}
/** Get a named attribute of the variable; e.g. xxx.yyy */
@Override
public VariableReference getAttribute(String attributeName)
throws ScriptException
{
// We recognize only the __size__ attribute
if (attributeName.equals(ATTRIBUTE_SIZE))
return new VariableInt(configuration.getChildCount());
if (attributeName.equals(ATTRIBUTE_DICT))
{
VariableDict dict = new VariableDict();
int i = 0;
while (i < configuration.getChildCount())
{
ConfigurationNode child = configuration.findChild(i++);
String type = child.getType();
dict.getIndexed(new VariableString(type)).setReference(new VariableConfigurationNode(child));
}
return dict;
}
return super.getAttribute(attributeName);
}
/** Get an indexed property of the variable */
@Override
public VariableReference getIndexed(Variable index)
throws ScriptException
{
if (index == null)
throw new ScriptException(composeMessage("Subscript cannot be null"));
int indexValue = index.getIntValue();
if (indexValue >= 0 && indexValue < configuration.getChildCount())
return new NodeReference(indexValue);
throw new ScriptException(composeMessage("Subscript is out of bounds: "+indexValue));
}
/** Insert an object into this variable at a position. */
@Override
public void insertAt(Variable v, Variable index)
throws ScriptException
{
if (v == null)
throw new ScriptException(composeMessage("Can't insert a null object into a configuration"));
if (index == null)
configuration.addChild(configuration.getChildCount(),v.getConfigurationNodeValue());
else
{
int indexValue = index.getIntValue();
if (indexValue < 0 || indexValue > configuration.getChildCount())
throw new ScriptException(composeMessage("Configuration insert out of bounds: "+indexValue));
configuration.addChild(indexValue,v.getConfigurationNodeValue());
}
}
/** Delete an object from this variable at a position. */
@Override
public void removeAt(Variable index)
throws ScriptException
{
if (index == null)
throw new ScriptException(composeMessage("Configuration remove index cannot be null"));
int indexValue = index.getIntValue();
if (indexValue < 0 || indexValue >= configuration.getChildCount())
throw new ScriptException(composeMessage("Configuration remove index out of bounds"));
configuration.removeChild(indexValue);
}
@Override
public VariableReference plus(Variable v)
throws ScriptException
{
if (v == null)
throw new ScriptException(composeMessage("Binary '+' can't add a null object"));
ConfigurationNode node = v.getConfigurationNodeValue();
Configuration c = new Configuration();
int i = 0;
while (i < configuration.getChildCount())
{
ConfigurationNode child = configuration.findChild(i++);
c.addChild(c.getChildCount(),child);
}
c.addChild(c.getChildCount(),node);
return new VariableConfiguration(c);
}
/** Extend VariableReference class so we capture attempts to set the reference, and actually overwrite the child when that is done */
protected class NodeReference implements VariableReference
{
protected int index;
public NodeReference(int index)
{
this.index = index;
}
@Override
public void setReference(Variable v)
throws ScriptException
{
if (index < 0 || index >= configuration.getChildCount())
throw new ScriptException(composeMessage("Index out of range for Configuration children: "+index));
ConfigurationNode confNode = v.getConfigurationNodeValue();
configuration.removeChild(index);
configuration.addChild(index,confNode);
}
@Override
public Variable resolve()
throws ScriptException
{
if (index < 0 || index >= configuration.getChildCount())
throw new ScriptException(composeMessage("Index out of range for Configuration children: "+index));
return new VariableConfigurationNode(configuration.findChild(index));
}
/** Check if this reference is null */
@Override
public boolean isNull()
{
return index < 0 || index >= configuration.getChildCount();
}
}
}