package org.swellrt.api.js.generic; import com.google.gwt.core.client.JavaScriptObject; import org.swellrt.api.js.WaveClientJS; import org.swellrt.model.generic.Model; import org.waveprotocol.wave.model.wave.ParticipantId; /** * A JavaScript Wrapper for the CommunityWavelet class * * @author pablojan@gmail.com * */ public class ModelJS extends JavaScriptObject implements Model.Listener { //private final static AdapterJS itemAdapterJS = new ItemAdapterJS(); public native static ModelJS create(Model delegate) /*-{ var jso = { callbackMap: new Object(), eventHandlers: new Object(), registerEventHandler: function(event, handler) { this.eventHandlers[event] = handler; }, unregisterEventHandler: function(event, handler) { this.eventHandlers[event] = null; }, id: function() { return delegate.@org.swellrt.model.generic.Model::getId()(); }, getParticipants: function() { var _participants = delegate.@org.swellrt.model.generic.Model::getParticipants()(); return @org.swellrt.api.SwellRTUtils::participantIterableToJs(Ljava/lang/Iterable;)(_participants); }, addParticipant: function(address) { return delegate.@org.swellrt.model.generic.Model::addParticipant(Ljava/lang/String;)(address); }, removeParticipant: function(address) { return delegate.@org.swellrt.model.generic.Model::removeParticipant(Ljava/lang/String;)(address); }, createMap: function() { var _map = delegate.@org.swellrt.model.generic.Model::createMap()(); return @org.swellrt.api.js.generic.AdapterTypeJS::adapt(Lorg/swellrt/model/generic/Type;)(_map); }, createString: function(strValue) { var _str = delegate.@org.swellrt.model.generic.Model::createString(Ljava/lang/String;)(strValue); return @org.swellrt.api.js.generic.AdapterTypeJS::adapt(Lorg/swellrt/model/generic/Type;)(_str); }, createList: function() { var _list = delegate.@org.swellrt.model.generic.Model::createList()(); return @org.swellrt.api.js.generic.AdapterTypeJS::adapt(Lorg/swellrt/model/generic/Type;)(_list); }, createText: function(textOrXml) { var _txt = delegate.@org.swellrt.model.generic.Model::createText(Ljava/lang/String;)(textOrXml); return @org.swellrt.api.js.generic.AdapterTypeJS::adapt(Lorg/swellrt/model/generic/Type;)(_txt); }, createFile: function(file, onComplete, progressListener) { if (!file instanceof File) { throw "INVALID_ARGUMENT"; } if (typeof onComplete !== "function") { throw "INVALID_ARGUMENT"; } if (progressListener && typeof progressListener !== "function") { throw "INVALID_ARGUMENT"; } var attachmentId = delegate.@org.swellrt.model.generic.Model::generateAttachmentId()(); var id = attachmentId.@org.waveprotocol.wave.media.model.AttachmentId::getId()(); var waveRef = @org.swellrt.api.SwellRTUtils::encodeWaveRefUri(Lorg/swellrt/model/generic/Model;)(delegate); var url = @org.swellrt.api.SwellRTUtils::buildAttachmentUploadUrl(Ljava/lang/String;)(id); var formData = new FormData(); formData.append("attachmentId", id); formData.append("waveRef", waveRef); formData.append("uploadFormElement", file, file.name); var request = new XMLHttpRequest(); request.onload = function(event) { if (request.status == 201) { var _file = delegate.@org.swellrt.model.generic.Model::createFile(Lorg/waveprotocol/wave/media/model/AttachmentId;Ljava/lang/String;)(attachmentId, file.type); onComplete(@org.swellrt.api.js.generic.AdapterTypeJS::adapt(Lorg/swellrt/model/generic/Type;)(_file)); } else { onComplete({ error : "SERVICE_EXCEPTION" }); } }; if (progressListener) { request.addEventListener("progress", progressListener); } request.open("POST", url); request.setRequestHeader("Accept", "text/plain"); @org.swellrt.api.SwellRTUtils::addCommonRequestHeaders(Lcom/google/gwt/core/client/JavaScriptObject;)(request); request.send(formData); return true; }, // For debug purpose only getDocuments: function() { var _docs = delegate.@org.swellrt.model.generic.Model::getModelDocuments()(); return @org.swellrt.api.SwellRTUtils::stringIterableToJs(Ljava/lang/Iterable;)(_docs); }, getDocument: function(docId) { return delegate.@org.swellrt.model.generic.Model::getModelDocument(Ljava/lang/String;)(docId); }, debugDocumentEvents: function(docId, enable) { return delegate.@org.swellrt.model.generic.Model::debugDocumentEvents(Ljava/lang/String;Z)(docId, enable); } }; // jso // Initialize the JS root map jso.root = @org.swellrt.api.js.generic.ModelJS::createRootJs(Lorg/swellrt/model/generic/Model;)(delegate); return jso; }-*/; protected ModelJS() { } private final static MapTypeJS createRootJs(Model delegate) { MapTypeJS mapJs = MapTypeJS.create(delegate.getRoot()); delegate.getRoot().addListener(mapJs); return mapJs; } private final native void fireEvent(String event, Object parameter) /*-{ if (this.eventHandlers[event] != null) { this.eventHandlers[event](parameter); } }-*/; @Override public final void onAddParticipant(ParticipantId participant) { fireEvent(WaveClientJS.PARTICIPANT_ADDED, participant.getAddress()); } @Override public final void onRemoveParticipant(ParticipantId participant) { fireEvent(WaveClientJS.PARTICIPANT_REMOVED, participant.getAddress()); } }