package org.ws4d.coap.rest; import java.util.HashMap; import java.util.Vector; import org.apache.log4j.Logger; import org.ws4d.coap.interfaces.CoapChannel; import org.ws4d.coap.interfaces.CoapRequest; import org.ws4d.coap.messages.CoapMediaType; /** * Well-Known CoRE support (draft-ietf-core-link-format-05) * * @author Nico Laum <nico.laum@uni-rostock.de> * @author Christian Lerche <christian.lerche@uni-rostock.de> */ public class CoreResource implements CoapResource { /* use the logger of the resource server */ private final static Logger logger = Logger.getLogger(CoapResourceServer.class); private final static String uriPath = "/.well-known/core"; private HashMap<Resource, String> coreStrings = new HashMap<Resource, String>(); ResourceServer serverListener = null; CoapResourceServer server = null; public CoreResource (CoapResourceServer server){ this.server = server; } /*Hide*/ @SuppressWarnings("unused") private CoreResource (){ } public String getMimeType() { return null; } public String getPath() { return uriPath; } public String getShortName() { return getPath(); } public byte[] getValue() { return buildCoreString(null).getBytes(); } public void registerResource(Resource resource) { if (resource != null) { StringBuilder coreLine = new StringBuilder(); coreLine.append("<"); coreLine.append(resource.getPath()); coreLine.append(">"); // coreLine.append(";ct=???"); coreLine.append(";rt=\"" + resource.getResourceType() + "\""); // coreLine.append(";if=\"observations\""); coreStrings.put(resource, coreLine.toString()); } } private String buildCoreString(String resourceType) { /* TODO: implement filtering also with ct and if*/ HashMap<String, Resource> resources = server.getResources(); StringBuilder returnString = new StringBuilder(); for (Resource resource : resources.values()){ if (resourceType == null || resource.getResourceType() == resourceType) { returnString.append("<"); returnString.append(resource.getPath()); returnString.append(">"); // coreLine.append(";ct=???"); if (resource.getResourceType() != null) { returnString.append(";rt=\"" + resource.getResourceType() + "\""); } // coreLine.append(";if=\"observations\""); returnString.append(","); } } return returnString.toString(); } public byte[] getValue(Vector<String> queries) { for (String query : queries) { if (query.startsWith("rt=")) return buildCoreString(query.substring(3)).getBytes(); } return getValue(); } public String getResourceType() { // TODO implement return null; } public CoapMediaType getCoapMediaType() { return CoapMediaType.link_format; } public void post(byte[] data) { /* nothing happens in case of a post */ return; } public void changed() { } public void registerServerListener(ResourceServer server) { this.serverListener = server; } public void unregisterServerListener(ResourceServer server) { this.serverListener = null; } public boolean addObserver(CoapRequest request) { // TODO: implement. Is this resource observeable? (should) return false; } public void removeObserver(CoapChannel channel) { // TODO: implement. Is this resource observeable? (should) } public boolean isObservable() { return false; } public int getObserveSequenceNumber(){ return 0; } public long expires() { /* expires never */ return -1; } public boolean isExpired() { return false; } }