/* $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(); } } }