/*
* 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.sp.inmemory;
import org.xcmis.spi.CmisConstants;
import org.xcmis.spi.PolicyData;
import org.xcmis.spi.model.BaseType;
import org.xcmis.spi.model.Property;
import org.xcmis.spi.model.PropertyType;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.URI;
import java.util.Calendar;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
/**
* @author <a href="mailto:andrey00x@gmail.com">Andrey Parfonov</a>
* @version $Id$
*/
final class Entry
{
private Map<String, Value> values;
private Map<String, Set<String>> permissions;
private Set<String> policies;
public Entry()
{
}
public Entry(Map<String, Value> values, Set<String> policies, Map<String, Set<String>> permissions)
{
this.values = values != null ? new ConcurrentHashMap<String, Value>(values) : null;
this.policies = policies != null ? new CopyOnWriteArraySet<String>(policies) : null;
this.permissions = permissions != null ? new ConcurrentHashMap<String, Set<String>>(permissions) : null;
}
public void addPolicy(PolicyData policy)
{
getPolicies().add(policy.getObjectId());
}
public BaseType getBaseTypeId()
{
Value value = getValues().get(CmisConstants.BASE_TYPE_ID);
if (value != null)
{
String[] strs = value.getStrings();
return strs.length > 0 ? BaseType.fromValue(strs[0]) : null;
}
return null;
}
public String getId()
{
Value value = getValues().get(CmisConstants.OBJECT_ID);
if (value != null)
{
String[] strs = value.getStrings();
return strs.length > 0 ? strs[0] : null;
}
return null;
}
public Map<String, Set<String>> getPermissions()
{
if (permissions == null)
{
permissions = new ConcurrentHashMap<String, Set<String>>();
}
return permissions;
}
public Collection<String> getPolicies()
{
if (policies == null)
{
policies = new CopyOnWriteArraySet<String>();
}
return policies;
}
public String getTypeId()
{
Value value = getValues().get(CmisConstants.OBJECT_TYPE_ID);
if (value != null)
{
String[] strs = value.getStrings();
return strs.length > 0 ? strs[0] : null;
}
return null;
}
public Value getValue(String id)
{
return getValues().get(id);
}
public Map<String, Value> getValues()
{
if (values == null)
{
values = new ConcurrentHashMap<String, Value>();
}
return values;
}
public void removePolicy(PolicyData policy)
{
getPolicies().remove(policy.getObjectId());
}
public void setPermissions(Map<String, Set<String>> permissions)
{
Map<String, Set<String>> ps = getPermissions();
ps.clear();
ps.putAll(permissions);
}
@SuppressWarnings("unchecked")
public void setProperty(Property<?> property)
{
if (property.getType() == PropertyType.BOOLEAN)
{
List<Boolean> booleans = (List<Boolean>)property.getValues();
setValue(property.getId(), new BooleanValue(booleans));
}
else if (property.getType() == PropertyType.DATETIME)
{
List<Calendar> dates = (List<Calendar>)property.getValues();
setValue(property.getId(), new DateValue(dates));
}
else if (property.getType() == PropertyType.DECIMAL)
{
List<BigDecimal> decimals = (List<BigDecimal>)property.getValues();
setValue(property.getId(), new DecimalValue(decimals));
}
else if (property.getType() == PropertyType.INTEGER)
{
List<BigInteger> integers = (List<BigInteger>)property.getValues();
setValue(property.getId(), new IntegerValue(integers));
}
else if (property.getType() == PropertyType.URI)
{
List<URI> uris = (List<URI>)property.getValues();
setValue(property.getId(), new UriValue(uris));
}
else if (property.getType() == PropertyType.STRING || property.getType() == PropertyType.HTML
|| property.getType() == PropertyType.ID)
{
List<String> text = (List<String>)property.getValues();
setValue(property.getId(), new StringValue(text));
}
}
public void setValue(String id, Value value)
{
Map<String, Value> vs = getValues();
if (value == null)
{
vs.remove(id);
}
else
{
vs.put(id, value);
}
}
public void setValues(Map<String, Value> values)
{
if (values != null)
{
for (Map.Entry<String, Value> e : values.entrySet())
{
setValue(e.getKey(), e.getValue());
}
}
}
public String toString()
{
return getId();
}
}