All Downloads are FREE. Search and download functionalities are using the official Maven repository.

info.kwarc.sally4.mhw.base.factories.MathHubDocumentFactory Maven / Gradle / Ivy

The newest version!
package info.kwarc.sally4.mhw.base.factories;

import info.kwarc.sally.comm.mathhubdocument.GetDocumentMeta;
import info.kwarc.sally.comm.mathhubdocument.GetDocumentMetaResponse;
import info.kwarc.sally4.framing.SallyFrameMenu;
import info.kwarc.sally4.lmh.impl.LMHImpl;
import info.kwarc.sally4.mhw.base.IMathHubUser;
import info.kwarc.sally4.mhw.base.IMathHubWorker;
import info.kwarc.sally4.mhw.base.ISessionManager;
import info.kwarc.sally4.mhw.base.impl.MathHubDocument;
import info.kwarc.sally4.os.events.EventBusContext;
import info.kwarc.sally4.registration.SallyClient;
import info.kwarc.sally4.theo.Theo;
import info.kwarc.sally4.util.InstanceCreator;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

import org.apache.felix.ipojo.Factory;
import org.apache.felix.ipojo.annotations.Bind;
import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Instantiate;
import org.apache.felix.ipojo.annotations.Invalidate;
import org.apache.felix.ipojo.annotations.Requires;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;

@Component
@Instantiate
public class MathHubDocumentFactory {

	@Requires(filter="(factory.name="+MathHubDocument.factory_id+")")
	Factory mathHubDocFactory;
	
	@Requires
	ISessionManager sessionManager;
	
	Logger log = LoggerFactory.getLogger(getClass());
	
	List contexts = new ArrayList();

	@Invalidate
	void stop() {
		for (EventBusContext context : contexts) {
			context.unregister(this);
		}
	}
		
	@Bind(aggregate=true, optional=true)
	public void onNewDocument(final SallyClient client) {
		if (client.supports("mathhubdocument", "frames")) {
			contexts.add(client.getEventBusContext());
			client.getEventBusContext().register(this);
			
			ListenableFuture futureResponse = client.sendRequest(new GetDocumentMeta(), GetDocumentMetaResponse.class);
			Futures.addCallback(futureResponse, new FutureCallback() {
				@Override
				public void onSuccess(GetDocumentMetaResponse arg0) {
					try {
						IMathHubUser user = sessionManager.getUser(arg0.getSessionid());
						if (user == null) {
							log.error("No user could be assigned to session "+arg0.getSessionid());
							return;
						}
						
						String userId = user.getUserId();
						log.info("Session "+arg0.getSessionid()+" belongs to "+userId);
						String repoName = LMHImpl._getRepoFromFilePath(arg0.getDocPath());
						
						for (IMathHubWorker worker : user.getAssignedWorkers()) {
							worker.ensureRunningRepository(repoName);
							InstanceCreator.init(mathHubDocFactory).setInstanceName("MHDoc for "+arg0.getDocPath()+"@"+client.getDocQueue()).setProperty("userId", userId)
							.setProperty("filePath", arg0.getDocPath())
							.setDynamicRequirement("user", "userId", userId)
							.setDynamicRequirement("client", SallyClient.clientQueue, client.getDocQueue())
							.setDynamicRequirement("frame", SallyFrameMenu.clientProperty, client.getDocQueue())						
							.setDynamicRequirement("theo", Theo.environmentID, client.getEnvironmentID())						
							.setDynamicRequirement(MathHubDocument.mathHubWorker, "mhwid", worker.getMHWID())						
							.setDynamicRequirement(MathHubDocument.mathHubRepository, "(&(mhwid="+worker.getMHWID()+")(repoName="+repoName+"))")						
							.create();
						}
						
					} catch (Exception e) {
						StringWriter sw = new StringWriter();
						PrintWriter pw = new PrintWriter(sw);
						e.printStackTrace(pw);
						log.error(sw.toString()); // stack trace as a string
						e.printStackTrace();
					}					
				}

				@Override
				public void onFailure(Throwable t) {
					
				}
			});
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy