/**
* Copyright (C) 2000-2016 Atomikos <info@atomikos.com>
*
* LICENSE CONDITIONS
*
* See http://www.atomikos.com/Main/WhichLicenseApplies for details.
*/
package com.atomikos.icatch.tcc.rest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.OPTIONS;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.xml.datatype.DatatypeConfigurationException;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
import org.apache.cxf.jaxrs.provider.json.JSONProvider;
import com.atomikos.tcc.rest.ParticipantLink;
@Path("/participant")
public class TestParticipant {
private JAXRSServerFactoryBean sf;
private boolean cancelCalled;
private boolean confirmCalled;
private boolean simulateTimeout;
private boolean optionsCalled;
private boolean failOnOptions;
private boolean failOnCancel;
public TestParticipant() {
}
public void stop() {
if (sf != null) sf.getBus().shutdown(true);
sf = null;
}
public void export(String url) {
sf = new JAXRSServerFactoryBean();
JSONProvider prov = new JSONProvider();
List<String> mimeTypes = new ArrayList<String>();
mimeTypes.add(MimeTypes.MIME_TYPE_PARTICIPANT_V1);
prov.setProduceMediaTypes(mimeTypes);
Map<String,String> nsMap = new HashMap<String,String>();
nsMap.put("http://www.atomikos.com/tcc/rest/v1", "tcc");
prov.setNamespaceMap(nsMap);
sf.setProvider(prov);
sf.setResourceClasses(TestParticipant.class);
sf.setResourceProvider(TestParticipant.class,
new SingletonResourceProvider(this));
sf.setAddress(url);
sf.create();
}
@DELETE
@Consumes("application/tcc")
public void cancel() {
cancelCalled = true;
if (failOnCancel) throw new WebApplicationException();
}
ParticipantLink getConfirmLink() throws DatatypeConfigurationException {
ParticipantLink confirm = new ParticipantLink("http://www.example.com/participant","2002-05-30T09:30:10Z");
return confirm;
}
@PUT
@Consumes("application/tcc")
public void confirm(@Context HttpHeaders headers) {
assertAcceptHeaderPresent(headers);
confirmCalled = true;
if (simulateTimeout) throw new WebApplicationException(404);
}
private void assertAcceptHeaderPresent(HttpHeaders headers) {
if ( ! headers.getRequestHeader("Accept").contains(MimeTypes.MIME_TYPE_PARTICIPANT_V1)) throw new WebApplicationException(406);
if ( ! headers.getRequestHeader("Content-Type").contains(MimeTypes.MIME_TYPE_PARTICIPANT_V1)) throw new WebApplicationException(406);
}
@PUT
@Consumes("text/plain")
public void confirmWithWrongAccept() {
throw new WebApplicationException(404);
}
public void setSimulateTimeout() {
simulateTimeout = true;
}
public boolean wasCancelled() {
return cancelCalled;
}
public void reset() {
cancelCalled = false;
confirmCalled = false;
simulateTimeout = false;
optionsCalled = false;
failOnOptions = false;
failOnCancel = false;
}
public boolean wasConfirmed() {
return confirmCalled;
}
@OPTIONS
public void options() {
optionsCalled = true;
if (failOnOptions) throw new WebApplicationException(500);
}
public boolean wasOptionsCalled() {
return optionsCalled;
}
public void setFailOnOptions() {
failOnOptions = true;
}
public void setSimulateErrorOnCancel() {
failOnCancel = true;
}
public static void main(String[] args) throws Exception {
new TestParticipant().export("http://localhost:9000/");
System.out.println("Server ready...");
Thread.sleep(5 * 60 * 1000);
System.out.println("Server exiting");
System.exit(0);
}
}