blob: ce6bce7c2cf6ac4167a8513079561d4956c7be21 [file] [log] [blame]
/*
* 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.sling.scripting.javascript.wrapper;
import javax.jcr.Property;
import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
import org.apache.sling.scripting.javascript.SlingWrapper;
import org.mozilla.javascript.ScriptRuntime;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.Undefined;
/** Wrap a JCR Property as a Scriptable */
@SuppressWarnings("serial")
public class ScriptableProperty extends ScriptableBase implements SlingWrapper {
public static final String CLASSNAME = "Property";
private static final Class<?>[] WRAPPED_CLASSES = { Property.class };
/**
* The wrapped JCR Property instance. Will be {@code null} if the
* {@link #jsConstructor(Object)} method is not called, which particularly
* is the case for the Property host object prototype.
*/
private Property property;
public ScriptableProperty() {
}
public void jsConstructor(Object res) {
this.property = (Property) res;
}
@Override
public String getClassName() {
return CLASSNAME;
}
public Class<?>[] getWrappedClasses() {
return WRAPPED_CLASSES;
}
public Object jsGet_value() {
try {
return property.getValue();
} catch (RepositoryException re) {
return Undefined.instance;
}
}
public Object jsGet_values() {
try {
return property.getValues();
} catch (RepositoryException re) {
return Undefined.instance;
}
}
public Object jsGet_string() {
try {
return property.getString();
} catch (RepositoryException re) {
return Undefined.instance;
}
}
public Object jsGet_stream() {
try {
return property.getStream();
} catch (RepositoryException re) {
return Undefined.instance;
}
}
public Object jsGet_long() {
try {
return property.getLong();
} catch (RepositoryException re) {
return Undefined.instance;
}
}
public Object jsGet_double() {
try {
return property.getDouble();
} catch (RepositoryException re) {
return Undefined.instance;
}
}
public Object jsGet_date() {
try {
return property.getDate();
} catch (RepositoryException re) {
return Undefined.instance;
}
}
public Object jsGet_boolean() {
try {
return property.getBoolean();
} catch (RepositoryException re) {
return Undefined.instance;
}
}
public Object jsGet_node() {
try {
return ScriptRuntime.toObject(this, property.getValue());
} catch (RepositoryException re) {
return Undefined.instance;
}
}
public Object jsGet_length() {
try {
return property.getLength();
} catch (RepositoryException re) {
return Undefined.instance;
}
}
public long[] jsGet_lengths() {
try {
return property.getLengths();
} catch (RepositoryException re) {
return new long[0];
}
}
public Object jsGet_definition() {
try {
return property.getDefinition();
} catch (RepositoryException re) {
return Undefined.instance;
}
}
public int getType() {
try {
return property.getType();
} catch (RepositoryException re) {
return PropertyType.UNDEFINED;
}
}
public Object jsGet_session() {
try {
return property.getSession();
} catch (RepositoryException re) {
return Undefined.instance;
}
}
public String jsGet_path() {
try {
return property.getPath();
} catch (RepositoryException e) {
return property.toString();
}
}
public String jsGet_name() {
try {
return property.getName();
} catch (RepositoryException e) {
return property.toString();
}
}
public Object jsGet_parent() {
try {
return ScriptRuntime.toObject(this, property.getParent());
} catch (RepositoryException re) {
return Undefined.instance;
}
}
public int jsGet_depth() {
try {
return property.getDepth();
} catch (RepositoryException re) {
return -1;
}
}
public boolean jsGet_new() {
return property.isNew();
}
public boolean jsGet_modified() {
return property.isModified();
}
public Object jsFunction_valueOf(String hint) {
if ("undefined".equals(hint)) {
try {
switch (property.getType()) {
case PropertyType.BOOLEAN:
return property.getBoolean();
case PropertyType.DATE:
return property.getDate();
case PropertyType.DOUBLE:
return property.getDouble();
case PropertyType.LONG:
return property.getLong();
default:
return toString();
}
} catch (RepositoryException re) {
// don't care, just return the string value
return toString();
}
} else if ("object".equals(hint)) {
// return this as a Scriptable :-)
return this;
} else if ("function".equals(hint)) {
// cannot return this as a Function
return Undefined.instance;
} else if ("boolean".equals(hint)) {
// boolean value
try {
property.getBoolean();
} catch (RepositoryException re) {
return false;
}
} else if ("number".equals(hint)) {
// numeric value
try {
property.getDouble();
} catch (RepositoryException re) {
return 0.0;
}
}
// unknown hint or "string"
return toString();
}
@Override
public Object get(String name, Scriptable start) {
final Object fromSuperclass = super.get(name, start);
if(fromSuperclass != Scriptable.NOT_FOUND) {
return fromSuperclass;
}
if(property == null) {
return Undefined.instance;
}
return getNative(name, start);
}
public Object jsFunction_toString() {
return toString();
}
@Override
public String toString() {
if (property != null) {
try {
return property.getValue().getString();
} catch (RepositoryException e) {
return property.toString();
}
}
return String.valueOf((Object) null);
}
// ---------- Wrapper interface --------------------------------------------
public Object unwrap() {
return property;
}
@Override
protected Class<?> getStaticType() {
return Property.class;
}
@Override
protected Object getWrappedObject() {
return property;
}
}