/*
* Data Hub Service (DHuS) - For Space data distribution.
* Copyright (C) 2013,2014,2015 GAEL Systems
*
* This file is part of DHuS software sources.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.gael.dhus.olingo.v1.entity;
import fr.gael.dhus.olingo.v1.Expander;
import fr.gael.dhus.olingo.v1.ExpectedException.InvalidTargetException;
import fr.gael.dhus.olingo.v1.Model;
import fr.gael.dhus.olingo.v1.entityset.ClassEntitySet;
import fr.gael.dhus.olingo.v1.map.impl.ClassMap;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.apache.olingo.odata2.api.exception.ODataException;
import org.apache.olingo.odata2.api.uri.NavigationSegment;
/**
* Class entity is focused on its URI denoted by OntClass namespace.
*/
public class Class extends AbstractEntity
{
private String id;
private Product product;
private String uri;
public Class(Product product)
{
this.product = product;
}
public Class(String uri)
{
this.uri=uri;
}
public String getUri ()
{
if (uri==null)
this.uri = product.getItemClass ().getUri();
return this.uri;
}
/**
* Returns this class id (with UUID standard format). It "id" not provided in
* input, it is automatically computed the MD5 hash of the
*
* @return
*/
public String getId()
{
if(this.id == null)
{
try
{
this.id = UUID.nameUUIDFromBytes(getUri().
getBytes("UTF-8")).toString();
}
catch (UnsupportedEncodingException e)
{
throw new UnsupportedOperationException(
"Cannot compute Class Id for URI " + getUri(), e);
}
}
return this.id;
}
@Override
public Map<String, Object> toEntityResponse(String root_url)
{
Map<String, Object> res = new HashMap<>();
res.put(ClassEntitySet.ID, getId());
res.put(ClassEntitySet.URI, getUri());
return res;
}
@Override
public Object getProperty(String prop_name) throws ODataException
{
if(prop_name.equals(ClassEntitySet.ID)) return getId();
if(prop_name.equals(ClassEntitySet.URI)) return getUri();
throw new ODataException ("Property '" + prop_name + "' not found.");
}
@Override
public Object navigate(NavigationSegment ns) throws ODataException
{
Object res;
if (ns.getEntitySet().getName().equals(Model.CLASS.getName()))
{
res = new ClassMap(this);
if (!ns.getKeyPredicates().isEmpty())
{
res = ((ClassMap)res).get(ns.getKeyPredicates().get(0).getLiteral());
}
}
else
{
throw new InvalidTargetException(this.getClass().getSimpleName(), ns.getEntitySet().getName());
}
return res;
}
@Override
public List<String> getExpandableNavLinkNames()
{
return Collections.singletonList("Classes");
}
@Override
public List<Map<String, Object>> expand(String navlink_name, String self_url)
{
if (navlink_name.equals("Classes"))
{
return Expander.mapToData(new ClassMap(this), self_url);
}
return super.expand(navlink_name, self_url);
}
}