blob: 334f9c3916ac5d4b27a4277ee70bb10b2be0d9e0 [file] [log] [blame]
/*
* Copyright (c) 2008, Niclas Hedhman. All Rights Reserved.
*
* Licensed 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.zest.library.rest.admin;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.apache.zest.api.entity.EntityComposite;
import org.apache.zest.api.entity.EntityReference;
import org.apache.zest.api.injection.scope.Service;
import org.apache.zest.api.value.ValueSerialization;
import org.apache.zest.spi.query.EntityFinder;
import org.apache.zest.spi.query.EntityFinderException;
import org.restlet.data.CharacterSet;
import org.restlet.data.MediaType;
import org.restlet.data.Status;
import org.restlet.ext.atom.Entry;
import org.restlet.ext.atom.Feed;
import org.restlet.ext.atom.Link;
import org.restlet.ext.atom.Text;
import org.restlet.representation.EmptyRepresentation;
import org.restlet.representation.OutputRepresentation;
import org.restlet.representation.Representation;
import org.restlet.representation.Variant;
import org.restlet.representation.WriterRepresentation;
import org.restlet.resource.ResourceException;
import org.restlet.resource.ServerResource;
/**
* Listing of all Entities.
* <p>
* Mapped to /entity
* </p>
*/
public class EntitiesResource
extends ServerResource
{
@Service
private EntityFinder entityFinder;
@Service
private ValueSerialization valueSerialization;
public EntitiesResource()
{
super();
// Define the supported variants.
getVariants().addAll(
Arrays.asList( new Variant( MediaType.TEXT_HTML ), new Variant( MediaType.APPLICATION_RDF_XML ),
new Variant( MediaType.APPLICATION_JSON ), new Variant( MediaType.APPLICATION_ATOM ) ) );
setNegotiated( true );
}
@Override
protected Representation get( Variant variant )
throws ResourceException
{
System.out.println( "VARIANT: " + variant.getMediaType() );
// Generate the right representation according to its media type.
if( MediaType.APPLICATION_JSON.equals( variant.getMediaType() ) )
{
return representJson();
}
else if( MediaType.APPLICATION_RDF_XML.equals( variant.getMediaType() ) )
{
return representRdf();
}
else if( MediaType.TEXT_HTML.equals( variant.getMediaType() ) )
{
return representHtml();
}
else if( MediaType.APPLICATION_ATOM.equals( variant.getMediaType() ) )
{
return representAtom();
}
throw new ResourceException( Status.CLIENT_ERROR_NOT_FOUND );
}
private Representation representJson()
throws ResourceException
{
try
{
final Iterable<EntityReference> query = entityFinder.findEntities( EntityComposite.class, null, null, null, null, Collections.<String, Object>emptyMap() );
return new OutputRepresentation( MediaType.APPLICATION_JSON )
{
@Override
public void write( OutputStream outputStream )
throws IOException
{
valueSerialization.serialize( query, outputStream );
}
};
}
catch( Exception e )
{
throw new ResourceException( e );
}
}
private Representation representRdf()
throws ResourceException
{
try
{
final Iterable<EntityReference> query = entityFinder.findEntities( EntityComposite.class, null, null, null, null, Collections.<String, Object>emptyMap() );
WriterRepresentation representation = new WriterRepresentation( MediaType.APPLICATION_RDF_XML )
{
@Override
public void write( Writer writer )
throws IOException
{
PrintWriter out = new PrintWriter( writer );
out.println( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<rdf:RDF\n"
+ "\txmlns=\"urn:qi4j:\"\n" + "\txmlns:qi4j=\"http://www.qi4j.org/rdf/model/1.0/\"\n"
+ "\txmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n"
+ "\txmlns:rdfs=\"http://www.w3.org/2000/01/rdf-schema#\">" );
for( EntityReference qualifiedIdentity : query )
{
out.println( "<qi4j:entity rdf:about=\"" + getRequest().getResourceRef().getPath() + "/"
+ qualifiedIdentity.identity() + ".rdf\"/>" );
}
out.println( "</rdf:RDF>" );
}
};
representation.setCharacterSet( CharacterSet.UTF_8 );
return representation;
}
catch( EntityFinderException e )
{
throw new ResourceException( Status.SERVER_ERROR_INTERNAL, e );
}
}
private Representation representHtml()
throws ResourceException
{
try
{
final Iterable<EntityReference> query = entityFinder.findEntities( EntityComposite.class, null, null, null, null, Collections.<String, Object>emptyMap() );
Representation representation = new WriterRepresentation( MediaType.TEXT_HTML )
{
@Override
public void write( Writer buf )
throws IOException
{
PrintWriter out = new PrintWriter( buf );
out.println( "<html><head><title>All entities</title></head><body><h1>All entities</h1><ul>" );
for( EntityReference entity : query )
{
out.println( "<li><a href=\""
+ getRequest().getResourceRef().clone().addSegment( entity.identity() + ".html" )
+ "\">" + entity.identity() + "</a></li>" );
}
out.println( "</ul></body></html>" );
}
};
representation.setCharacterSet( CharacterSet.UTF_8 );
return representation;
}
catch( EntityFinderException e )
{
throw new ResourceException( e );
}
}
private Representation representAtom()
throws ResourceException
{
try
{
Feed feed = new Feed();
feed.setTitle( new Text( MediaType.TEXT_PLAIN, "All entities" ) );
List<Entry> entries = feed.getEntries();
final Iterable<EntityReference> query = entityFinder.findEntities( EntityComposite.class, null, null, null, null, Collections.<String, Object>emptyMap() );
for( EntityReference entityReference : query )
{
Entry entry = new Entry();
entry.setTitle( new Text( MediaType.TEXT_PLAIN, entityReference.toString() ) );
Link link = new Link();
link.setHref( getRequest().getResourceRef().clone().addSegment( entityReference.identity() ) );
entry.getLinks().add( link );
entries.add( entry );
}
return feed;
}
catch( Exception e )
{
throw new ResourceException( e );
}
}
@Override
protected Representation post( Representation entity, Variant variant )
throws ResourceException
{
try
{
/*
* InputStream in = entity.getStream(); ObjectInputStream oin = new ObjectInputStream( in ); String identity
* = oin.readUTF(); Usecase usecase = (Usecase) oin.readUnshared(); MetaInfo unitofwork = (MetaInfo)
* oin.readUnshared(); Iterable<UnitOfWorkEvent> events = (Iterable<UnitOfWorkEvent>) oin.readUnshared();
*
* // Store state try { entityStore.apply( identity, events, usecase, unitofwork ).commit(); } catch(
* ConcurrentEntityStateModificationException e ) { throw new ResourceException(
* Status.CLIENT_ERROR_CONFLICT ); }
*/
}
catch( Exception e )
{
throw new ResourceException( e );
}
return new EmptyRepresentation();
}
}