/*
* 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.jackrabbit.core.state;
import org.apache.jackrabbit.core.id.PropertyId;
import org.apache.jackrabbit.core.id.NodeId;
import org.apache.jackrabbit.core.id.ItemId;
import org.apache.jackrabbit.core.value.InternalValue;
import org.apache.jackrabbit.spi.Name;
import javax.jcr.PropertyType;
/**
* <code>PropertyState</code> represents the state of a <code>Property</code>.
*/
public class PropertyState extends ItemState {
/**
* the id of this property state
*/
private PropertyId id;
/**
* the internal values
*/
private InternalValue[] values;
/**
* the type of this property state
*/
private int type;
/**
* flag indicating if this is a multivalue property
*/
private boolean multiValued;
/**
* Constructs a new property state that is initially connected to an
* overlayed state.
*
* @param overlayedState the backing property state being overlayed
* @param initialStatus the initial status of the property state object
* @param isTransient flag indicating whether this state is transient or not
*/
public PropertyState(PropertyState overlayedState, int initialStatus,
boolean isTransient) {
super(overlayedState, initialStatus, isTransient);
pull();
}
/**
* Create a new <code>PropertyState</code>
*
* @param id id of the property
* @param initialStatus the initial status of the property state object
* @param isTransient flag indicating whether this state is transient or not
*/
public PropertyState(PropertyId id, int initialStatus, boolean isTransient) {
super(initialStatus, isTransient);
this.id = id;
type = PropertyType.UNDEFINED;
values = InternalValue.EMPTY_ARRAY;
multiValued = false;
}
//-------------------------------------------------------< public methods >
/**
* {@inheritDoc}
*/
public synchronized void copy(ItemState state, boolean syncModCount) {
synchronized (state) {
PropertyState propState = (PropertyState) state;
id = propState.id;
type = propState.type;
values = propState.values;
multiValued = propState.multiValued;
if (syncModCount) {
setModCount(state.getModCount());
}
}
}
/**
* Determines if this item state represents a node.
*
* @return always false
* @see ItemState#isNode
*/
public boolean isNode() {
return false;
}
/**
* {@inheritDoc}
*/
public ItemId getId() {
return id;
}
/**
* Returns the identifier of this property.
*
* @return the id of this property.
*/
public PropertyId getPropertyId() {
return id;
}
/**
* {@inheritDoc}
*/
public NodeId getParentId() {
return id.getParentId();
}
/**
* Returns the name of this property.
*
* @return the name of this property.
*/
public Name getName() {
return id.getName();
}
/**
* Sets the type of this property.
*
* @param type the type to be set
* @see PropertyType
*/
public void setType(int type) {
this.type = type;
}
/**
* Sets the flag indicating whether this property is multi-valued.
*
* @param multiValued flag indicating whether this property is multi-valued
*/
public void setMultiValued(boolean multiValued) {
this.multiValued = multiValued;
}
/**
* Returns the type of this property.
*
* @return the type of this property.
* @see PropertyType
*/
public int getType() {
return type;
}
/**
* Returns true if this property is multi-valued, otherwise false.
*
* @return true if this property is multi-valued, otherwise false.
*/
public boolean isMultiValued() {
return multiValued;
}
/**
* Sets the value(s) of this property.
*
* @param values the new values
*/
public void setValues(InternalValue[] values) {
this.values = values;
}
/**
* Returns the value(s) of this property.
*
* @return the value(s) of this property.
*/
public InternalValue[] getValues() {
return values;
}
/**
* Returns an estimate of the memory size of this property state. The
* return value actually highly overestimates the amount of required
* memory, but changing the estimates would likely cause OOMs in many
* downstream deployments that have set their cache sizes based on
* experience with these erroneous size estimates. So we don't change
* the formula used by this method.
*/
@Override
public long calculateMemoryFootprint() {
return 350 + values.length * 100;
}
}