/**
* 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.restatom.collections;
import org.apache.abdera.factory.Factory;
import org.apache.abdera.i18n.iri.IRI;
import org.apache.abdera.model.Entry;
import org.apache.abdera.model.Feed;
import org.apache.abdera.protocol.server.RequestContext;
import org.apache.abdera.protocol.server.TargetType;
import org.apache.abdera.protocol.server.context.ResponseContextException;
import org.xcmis.restatom.AtomCMIS;
import org.xcmis.restatom.AtomUtils;
import org.xcmis.spi.CmisConstants;
import org.xcmis.spi.Connection;
import org.xcmis.spi.InvalidArgumentException;
import org.xcmis.spi.ItemsList;
import org.xcmis.spi.TypeNotFoundException;
import org.xcmis.spi.model.TypeDefinition;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
/**
* @author <a href="mailto:andrey.parfonov@exoplatform.com">Andrey Parfonov</a>
* @version $Id: TypesChildrenCollection.java 2487 2009-07-31 14:14:34Z
* andrew00x $
*/
public class TypesChildrenCollection extends CmisTypeCollection
{
public TypesChildrenCollection(Connection connection)
{
super(connection);
setHref("/types");
}
/**
* {@inheritDoc}
*/
protected void addFeedDetails(Feed feed, RequestContext request) throws ResponseContextException
{
try
{
String typeId = request.getTarget().getParameter(AtomCMIS.PARAM_TYPE_ID);
boolean includePropertyDefinitions =
getBooleanParameter(request, AtomCMIS.PARAM_INCLUDE_PROPERTY_DEFINITIONS, false);
int maxItems = getIntegerParameter(request, AtomCMIS.PARAM_MAX_ITEMS, CmisConstants.MAX_ITEMS);
int skipCount = getIntegerParameter(request, AtomCMIS.PARAM_SKIP_COUNT, CmisConstants.SKIP_COUNT);
Connection connection = getConnection(request);
ItemsList<TypeDefinition> list =
connection.getTypeChildren(typeId, includePropertyDefinitions, maxItems, skipCount);
addPageLinks(typeId, feed, "types", maxItems, skipCount, list.getNumItems(), list.isHasMoreItems(), request);
String down = getTypeDescendantsLink(typeId, request);
feed.addLink(down, AtomCMIS.LINK_DOWN, AtomCMIS.MEDIATYPE_CMISTREE, null, null, -1);
if (typeId != null)
{
String typeLink = getObjectTypeLink(typeId, request);
feed.addLink(typeLink, AtomCMIS.LINK_VIA, AtomCMIS.MEDIATYPE_ATOM_ENTRY, null, null, -1);
TypeDefinition type = connection.getTypeDefinition(typeId);
String parentType = type.getParentId();
if (parentType != null)
{
String parent = getObjectTypeLink(parentType, request);
feed.addLink(parent, AtomCMIS.LINK_UP, AtomCMIS.MEDIATYPE_ATOM_ENTRY, null, null, -1);
}
}
for (TypeDefinition type : list.getItems())
{
Entry e = feed.addEntry();
IRI feedIri = new IRI(getFeedIriForEntry(type, request));
addEntryDetails(request, e, feedIri, type);
}
}
catch (InvalidArgumentException iae)
{
throw new ResponseContextException(createErrorResponse(iae, 400));
}
catch (TypeNotFoundException tnfe)
{
throw new ResponseContextException(createErrorResponse(tnfe, 404));
}
catch (Exception t)
{
throw new ResponseContextException(createErrorResponse(t, 500));
}
}
/**
* {@inheritDoc}
*/
public Iterable<TypeDefinition> getEntries(RequestContext request) throws ResponseContextException
{
throw new UnsupportedOperationException("entries");
}
/**
* {@inheritDoc}
*/
public String getTitle(RequestContext request)
{
return "Types Children";
}
/**
* {@inheritDoc}
*/
@Override
protected Feed createFeedBase(RequestContext request) throws ResponseContextException
{
Factory factory = request.getAbdera().getFactory();
Feed feed = factory.newFeed();
feed.setId(getId(request));
feed.setTitle(getTitle(request));
feed.addAuthor(getAuthor(request));
feed.setUpdated(AtomUtils.getAtomDate(Calendar.getInstance()));
// Service link.
feed.addLink(getServiceLink(request), AtomCMIS.LINK_SERVICE, AtomCMIS.MEDIATYPE_ATOM_SERVICE, null, null, -1);
Map<String, String> params = new HashMap<String, String>();
params.put("repoid", getRepositoryId(request));
params.put("atomdoctype", "types");
params.put("id", request.getTarget().getParameter("typeid"));
String self = request.absoluteUrlFor(TargetType.ENTRY, params);
feed.addLink(self, AtomCMIS.LINK_SELF, AtomCMIS.MEDIATYPE_ATOM_FEED, null, null, -1);
return feed;
}
}