/*
(c) Copyright 2011 Telefonica, I+D. Printed in Spain (Europe). All Righ
Reserved.
The copyright to the software program(s) is property of Telefonica I+D.
The program(s) may be used and or copied only with the express written
consent of Telefonica I+D or in accordance with the terms and conditions
stipulated in the agreement/contract under which the program(s) have
been supplied.
*/
package com.telefonica.claudia.smi.templateManagement.resources;
import java.io.IOException;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.log4j.Logger;
import org.restlet.Context;
import org.restlet.data.MediaType;
import org.restlet.data.Request;
import org.restlet.data.Response;
import org.restlet.data.Status;
import org.restlet.resource.DomRepresentation;
import org.restlet.resource.Representation;
import org.restlet.resource.Resource;
import org.restlet.resource.ResourceException;
import org.restlet.resource.Variant;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import com.telefonica.claudia.smi.Main;
import com.telefonica.claudia.smi.templateManagement.TemplateManagementApplication;
import com.telefonica.claudia.smi.templateManagement.TemplateManagementDriver;
public class CatalogItemResource extends Resource {
private static Logger log = Logger.getLogger("CatalogItemResource");
String catalogId;
public CatalogItemResource(Context context, Request request, Response response) {
super(context, request, response);
this.catalogId = (String) getRequest().getAttributes().get("catalog-id");
// Get the item directly from the "persistence layer".
if (this.catalogId != null) {
// Define the supported variant.
getVariants().add(new Variant(MediaType.APPLICATION_XML));
getVariants().add(new Variant(MediaType.TEXT_XML));
// By default a resource cannot be updated.
setModifiable(true);
} else {
// This resource is not available.
setAvailable(false);
}
}
/**
* Handle GETS
*/
@Override
public Representation represent(Variant variant) throws ResourceException {
// Generate the right representation according to its media type.
try {
TemplateManagementDriver actualDriver= (TemplateManagementDriver) getContext().getAttributes().get(TemplateManagementApplication.ATTR_PLUGIN_TEMPLATEMANAGEMENT);
String catalogItemInfo = actualDriver.getCatalogItem(catalogId);
if (catalogItemInfo==null) {
log.error("Null response from the SM.");
getResponse().setStatus(Status.SERVER_ERROR_INTERNAL);
return null;
}
// Substitute the macros in the description
catalogItemInfo = catalogItemInfo.replace("@HOSTNAME", "http://" + Main.serverHost + ":" + Main.serverPort);
DocumentBuilderFactory dbf =
DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(catalogItemInfo));
Document doc = db.parse(is);
DomRepresentation representation = new DomRepresentation(
MediaType.TEXT_XML, doc);
log.info("Data returned for catalogItem : \n\n" + catalogItemInfo);
// Returns the XML representation of this document.
return representation;
} catch (IOException e) {
log.error("Error getCatalogItem("+catalogId+").");
getResponse().setStatus(Status.CLIENT_ERROR_NOT_FOUND);
return null;
} catch (SAXException e) {
log.error("Retrieved data was not in XML format: " + e.getMessage());
getResponse().setStatus(Status.SERVER_ERROR_INTERNAL);
return null;
} catch (ParserConfigurationException e) {
log.error("Error trying to configure parser.");
getResponse().setStatus(Status.SERVER_ERROR_INTERNAL);
return null;
}
}
}