/*
* SyncResource.java
*
* Created on April 12, 2007, 1:39 PM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package org.atomojo.app.admin;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Iterator;
import java.util.logging.Level;
import org.atomojo.app.App;
import org.atomojo.app.client.XMLRepresentationParser;
import org.atomojo.app.db.DB;
import org.atomojo.app.db.SyncProcess;
import org.infoset.xml.Document;
import org.infoset.xml.Element;
import org.infoset.xml.InfosetFactory;
import org.infoset.xml.ItemConstructor;
import org.infoset.xml.ItemDestination;
import org.infoset.xml.Name;
import org.infoset.xml.XMLException;
import org.infoset.xml.util.DocumentDestination;
import org.infoset.xml.util.DocumentSource;
import org.infoset.xml.util.WriterItemDestination;
import org.restlet.data.CharacterSet;
import org.restlet.data.MediaType;
import org.restlet.data.Reference;
import org.restlet.data.Status;
import org.restlet.representation.OutputRepresentation;
import org.restlet.representation.Representation;
import org.restlet.representation.StringRepresentation;
import org.restlet.resource.ServerResource;
/**
*
* @author alex
*/
public class SyncProcessesResource extends ServerResource implements AdminXML
{
/** Creates a new instance of SyncResource */
public SyncProcessesResource() {
setNegotiated(false);
}
public Representation get()
{
final DB db = (DB)getRequest().getAttributes().get(App.DB_ATTR);
Representation rep = new OutputRepresentation(MediaType.APPLICATION_XML) {
public void write(OutputStream os)
throws IOException
{
try {
Iterator<SyncProcess> procs = db.getSyncProcesses();
Writer out = new OutputStreamWriter(os,"UTF-8");
ItemDestination dest = new WriterItemDestination(out,"UTF-8");
ItemConstructor constructor = InfosetFactory.getDefaultInfoset().createItemConstructor();
dest.send(constructor.createDocument());
dest.send(constructor.createElement(AdminXML.NM_SYNC_PROCESSES));
while (procs.hasNext()) {
SyncProcess proc = procs.next();
proc.marshall();
DocumentSource.generate(proc.getElement(),false,dest);
}
dest.send(constructor.createElementEnd(AdminXML.NM_SYNC_PROCESSES));
dest.send(constructor.createDocumentEnd());
out.flush();
out.close();
} catch (XMLException ex) {
getContext().getLogger().log(Level.SEVERE,"Cannot get list of sync processes from DB: "+ex.getMessage(),ex);
getResponse().setStatus(Status.SERVER_ERROR_INTERNAL,"Cannot get list of sync processes due to XML DB error.");
}
}
};
rep.setCharacterSet(CharacterSet.UTF_8);
return rep;
}
public Representation post(Representation entity)
{
final DB db = (DB)getRequest().getAttributes().get(App.DB_ATTR);
if (!XMLRepresentationParser.isXML(entity.getMediaType())) {
getResponse().setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
return new StringRepresentation("Non-XML media type for entity body: "+entity.getMediaType().getName());
}
XMLRepresentationParser parser = new XMLRepresentationParser();
Document doc = null;
try {
DocumentDestination dest = new DocumentDestination();
Name [] roots = { AdminXML.NM_PUSH , AdminXML.NM_PULL };
parser.parse(entity,AdminApplication.createAdminDocumentDestination(dest,roots));
doc = dest.getDocument();
Element top = doc.getDocumentElement();
SyncProcess proc = new SyncProcess(db,top);
if (proc.exists()) {
getResponse().setStatus(Status.CLIENT_ERROR_CONFLICT);
return new StringRepresentation("Process with name "+proc.getName()+" already exists.");
}
if (proc.getRemoteApp()==null) {
getResponse().setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
return new StringRepresentation("The remote app service with name "+top.getAttributeValue("remote")+" does not exist.");
}
if (proc.getSyncTarget()==null) {
getResponse().setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
return new StringRepresentation("The local target with name "+top.getAttributeValue("target")+" does not exist.");
}
if (proc.create()) {
getResponse().setStatus(Status.SUCCESS_NO_CONTENT);
Reference ref = new Reference(getRequest().getResourceRef().toString()+"/"+proc.getName());
getResponse().setLocationRef(ref);
return null;
} else {
getContext().getLogger().severe("Cannot store XML for sync process");
getResponse().setStatus(Status.SERVER_ERROR_INTERNAL);
return new StringRepresentation("Internal error, see logs.");
}
} catch (Exception ex) {
getResponse().setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
return new StringRepresentation("XML parse error: "+ex.getMessage());
}
}
}