Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /* ************************************************************************
  #
  #  DivConq
  #
  #  http://divconq.com/
  #
  #  Copyright:
  #    Copyright 2014 eTimeline, LLC. All rights reserved.
  #
 #  License:
 #    See the license.txt file in the project's top-level directory for details.
 #
 #  Authors:
 #    * Andy White
 #
 ************************************************************************ */
 package divconq.api;
 
 
 
 // TODO make some of the properties accessible via RecordStruct fields for dcScript
 abstract public class ApiSession extends RecordStruct implements AutoCloseable {
 	static public ApiSession createLocalSession(String domain) {
 	}
 	
 	static public ApiSession createSessionFromConfig(String name) {
 		return ..createApiSession(name);
 	}
 	
 	protected String sessionid = null;
 	protected String sessionKey = null;
 	protected String hubid = null;
 	protected UserContext user = null;
 	protected ReplyService replies = new ReplyService();
 	public Message lastResult = null;
 	
 		return this.;
 	}
 	
 	public Message getLastResult() {
 		return this.;
 	}
 	
 	abstract public void init(XElement config);
 	
 	public void receiveMessage(Message msg) {
 		// we need to restore/set the local operation context if anything is done here.
 		// don't use the messages op context, it only applies within its own matrix
 		// at least for starters let's set to guest
 		
 		OperationContext.useNewGuest();
 		
 		..println("Got a message for ApiSession, not sure what to do with it!\n\n" + msg);
 		
 		// TODO else look at other services published through this session (raise message in event to API)
 		// push message back out to CoreApi
 	}
 
 	public UserContext getUser() {
 		return this.;
 	}
 
 	public String getSessionId() {
 		return this.;
 	}
 
 	public String getHubId() {
 		return this.;
 	}
 	
 	public String getSessionKey() {
 		return this.;
 	}
 	
 	abstract public void sendForgetMessage(Message msg);
 	
 	public Message sendMessage(Message msg) {
 		return this.sendMessage(msg.);
	}
	public Message sendMessage(Message msgTimeoutPlan timeoutPlan) {
		this. = null;
		final CountDownLatch latch = new CountDownLatch(1);
		this.sendMessage(msgnew ServiceResult(timeoutPlan) {
			public void callback() {
				latch.countDown();
			}
		});			
		try {
			latch.await();
		catch (InterruptedException x) {
			this. = MessageUtil.errorTr(445, x);
		}
		return this.;
	}
	abstract public void sendMessage(Message msgServiceResult callback);
	public void allocDataChannel(String titlefinal FuncCallback<Stringcallback) {
		Message msg = new Message("Session""DataChannel""Allocate"new RecordStruct(new FieldStruct("Title"title)));
		this.sendMessage(msgnew ServiceResult() {
			public void callback() {
				callback.copyMessages(this);				
				if (!this.hasErrors())
					callback.setResult(this.getBodyAsRec().getFieldAsString("ChannelId"));
				callback.complete();				
			}
		});			
	}
	public void freeDataChannel(String channelidfinal OperationCallback callback) {
		Message msg = new Message("Session""DataChannel""Free"new RecordStruct(new FieldStruct("ChannelId"channelid)));
		this.sendMessage(msgnew ServiceResult() {
			public void callback() {
				callback.copyMessages(this);				
				callback.complete();				
			}
		});			
	}
	public void establishDataStream(String titleString modeMessage streamRequestfinal FuncCallback<RecordStructcallback) {
		Message msg = new Message("Session""DataChannel""Establish"new RecordStruct(
				new FieldStruct("Title"title),
				new FieldStruct("Mode"mode),
				new FieldStruct("StreamRequest"streamRequest)
		));
		this.sendMessage(msgnew ServiceResult() {
			public void callback() {
				callback.copyMessages(this);				
				if (!this.hasErrors())
					callback.setResult(this.getBodyAsRec());
				callback.complete();				
			}
		});			
	}
	public void bindSourceChannel(String channelidRecordStruct addressingfinal OperationCallback callback) {
		// TODO validate addressing 
		RecordStruct body = new RecordStruct(
				new FieldStruct("ChannelId"channelid),
				new FieldStruct("Mode""Source"),
				new FieldStruct("Hub"addressing.getFieldAsAny("Hub")),
				new FieldStruct("Session"addressing.getFieldAsAny("Session")),
				new FieldStruct("Channel"addressing.getFieldAsAny("Channel"))
		);
		Message msg = new Message("Session""DataChannel""Bind"body);
		this.sendMessage(msgnew ServiceResult() {
			public void callback() {
				callback.copyMessages(this);				
				callback.complete();				
			}
		});			
	}
	public void bindDestChannel(String channelidRecordStruct addressingfinal OperationCallback callback) {
		// TODO validate addressing 
		RecordStruct body = new RecordStruct(
				new FieldStruct("ChannelId"channelid),
				new FieldStruct("Mode""Destination"),
				new FieldStruct("Hub"addressing.getFieldAsAny("Hub")),
				new FieldStruct("Session"addressing.getFieldAsAny("Session")),
				new FieldStruct("Channel"addressing.getFieldAsAny("Channel"))
		);
		Message msg = new Message("Session""DataChannel""Bind"body);
		this.sendMessage(msgnew ServiceResult() {
			public void callback() {
				callback.copyMessages(this);				
				callback.complete();				
			}
		});			
	}
	abstract public void sendStream(ScatteringByteChannel inlong sizelong offsetString channelidOperationCallback or);
	abstract public void receiveStream(WritableByteChannel outlong sizelong offsetString channelidOperationCallback callback);
	abstract public void abortStream(String channelid);
	public void thawContext(Message result) {
		if (result == null)
			return;	
		RecordStruct info = result.getFieldAsRecord("Body");
		if (info == null)
			return;
		this. = UserContext.allocate(info);		
		this. = info.getFieldAsString("SessionKey");
		this. =  info.getFieldAsString("SessionId");
		this. = this..substring(0, this..indexOf('_'));
	}
	public void clearToGuest() {
		this. = UserContext.allocateGuest();
	}
	public boolean startSession() {
		return this.startSession(null);
	}
	public boolean startSession(String userString pass) {
		return this.startSession(new RecordStruct(
				new FieldStruct("UserName"user),
				new FieldStruct("Password"pass)
			));
	}
	public boolean startSession(String userString passString code) {
		return this.startSession(new RecordStruct(
				new FieldStruct("UserName"user),
				new FieldStruct("Password"pass),
				new FieldStruct("ConfirmationCode"code)
			));
	}
	public boolean startSessionAsGuest() {
		return this.startSession(null);
	}
	public boolean startSession(RecordStruct creds) {
		// new creds means new user, start as guest
		if (creds != null)
		Message msg = new Message();
		msg.setField("Service""Session");
		msg.setField("Feature""Control");
		msg.setField("Op""Start");
		if (creds != null)
			msg.setField("Credentials"creds);
		Message rmsg = this.sendMessage(msg);
		if (rmsg == null)
			return false;
		this.thawContext(rmsg);
		// a real user or a guest will both be verified
		return !rmsg.hasErrors() && this.getUser().isVerified();
	}
	public void stop() {
		Message msg = new Message();
		msg.setField("Service""Session");
		msg.setField("Feature""Control");
		msg.setField("Op""Stop");
		this.stopped();
	}
	abstract public void stopped();
		Message msg = new Message();
		msg.setField("Service""Session");
		msg.setField("Feature""Control");
		msg.setField("Op""CheckInBox");
		Message rmsg = this.sendMessage(msg);
		if (rmsg.hasErrors())
			return null;
		ListStruct mlist = rmsg.getFieldAsList("Body"); 
		if (mlist == null)
			return null;
		ArrayList<Messagemsgs = new ArrayList<Message>();
		for (Struct m : mlist.getItems()) {
			if (m instanceof RecordStruct
				msgs.add(MessageUtil.fromRecord((RecordStructm));
		}
		return msgs;
	}
	public void operation(StackEntry stackXElement code) {
		if ("Stop".equals(code.getName())) {
			this.stop();
			stack.resume();
			return;
		}
		super.operation(stackcode);
	}
	public void close() {
		this.stop();
	}
New to GrepCode? Check out our FAQ X