/*
* Copyright (C) 2010 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.xcmis.search.content;
import org.apache.commons.lang.Validate;
import org.xcmis.search.value.PropertyType;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
/**
* Property of content.
*/
public class Property<V>
{
private final PropertyType type;
private final String name;
private final Collection<ContentValue<V>> value;
/**
* @param type
* @param name
* @param value
*/
public Property(PropertyType type, String name, Collection<ContentValue<V>> value)
{
super();
this.type = type;
this.name = name;
this.value = value;
}
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString()
{
return name + "=" + value.toString();
}
/**
* @param type
* @param name
* @param value
*/
public Property(PropertyType type, String name, ContentValue<V> value)
{
super();
this.type = type;
this.name = name;
this.value = new ArrayList<ContentValue<V>>(1);
this.value.add(value);
}
/**
* @return the type
*/
public PropertyType getType()
{
return type;
}
/**
* @return the name
*/
public String getName()
{
return name;
}
/**
* @return the value
*/
public Collection<ContentValue<V>> getValue()
{
return value;
}
public static abstract class ContentValue<V>
{
private final long length;
/**
* @param length
*/
public ContentValue(long length)
{
super();
this.length = length;
}
/**
*
* @return value of the property.
*/
public abstract V getValue();
/**
*
* @return the length of the value.
*/
public long getLength()
{
return length;
}
}
public static class SimpleValue<V> extends ContentValue<V>
{
/**
* @param value
*/
public SimpleValue(V value, long length)
{
super(length);
this.value = value;
}
/**
* @param value
*/
public SimpleValue(V value)
{
super(value.toString().length());
this.value = value;
}
private final V value;
/**
* @see org.xcmis.search.content.Property.ContentValue#getValue()
*/
public V getValue()
{
return value;
}
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString()
{
return value.toString();
}
}
public static class BinaryValue extends ContentValue<InputStream>
{
private final InputStream value;
private final String mimeType;
private final String encoding;
private final long length;
/**
* @param value
*/
public BinaryValue(InputStream value, String mimeType, String encoding, long length)
{
super(length);
Validate.notNull(value, "The value argument may not be null");
this.value = value;
this.mimeType = mimeType;
this.encoding = encoding;
this.length = length;
}
/**
* @return the mimeType
*/
public String getMimeType()
{
return mimeType;
}
/**
* @return the encoding
*/
public String getEncoding()
{
return encoding;
}
/**
* @see org.xcmis.search.content.Property.ContentValue#getValue()
*/
public InputStream getValue()
{
return value;
}
/**
* @see org.xcmis.search.content.Property.ContentValue#getLength()
*/
public long getLength()
{
return length;
}
}
}