/** * */ package org.goko.core.gcode.rs274ngcv3.jogl.internal; import java.util.Date; import org.goko.core.common.exception.GkException; import org.goko.core.controller.IGCodeContextProvider; import org.goko.core.controller.event.IGCodeContextListener; import org.goko.core.gcode.element.IInstructionSetIterator; import org.goko.core.gcode.execution.ExecutionToken; import org.goko.core.gcode.rs274ngcv3.IRS274NGCService; import org.goko.core.gcode.rs274ngcv3.context.GCodeContext; import org.goko.core.gcode.rs274ngcv3.element.InstructionProvider; import org.goko.core.gcode.rs274ngcv3.instruction.AbstractInstruction; import org.goko.core.log.GkLog; /** * @author Psyko * @date 10 juil. 2016 */ public class LinkedGCodeContextProvider implements IGCodeContextProvider<GCodeContext> { private static final GkLog LOG = GkLog.getLogger(LinkedGCodeContextProvider.class); private LinkedGCodeContextProvider previous; private ExecutionToken token; private IRS274NGCService gcodeService; private GCodeContext cachedContext; private Date updateDate; /** * @param previous * @param token * @param gcodeService */ public LinkedGCodeContextProvider(LinkedGCodeContextProvider previous, ExecutionToken token, IRS274NGCService gcodeService) { super(); this.previous = previous; this.token = token; this.gcodeService = gcodeService; } /** (inheritDoc) * @see org.goko.core.common.event.IObservable#addObserver(java.lang.Object) */ @Override public void addObserver(IGCodeContextListener<GCodeContext> observer) { throw new RuntimeException("Not implemented"); } /** (inheritDoc) * @see org.goko.core.common.event.IObservable#removeObserver(java.lang.Object) */ @Override public boolean removeObserver(IGCodeContextListener<GCodeContext> observer) { throw new RuntimeException("Not implemented"); } /** (inheritDoc) * @see org.goko.core.controller.IGCodeContextProvider#getGCodeContext() */ @Override public GCodeContext getGCodeContext() throws GkException { computeGCodeContext(); return new GCodeContext(cachedContext); } protected void computeGCodeContext(){ try{ previous.getGCodeContext(); if(updateDate == null || cachedContext == null || previous.getUpdateDate().getTime() > updateDate.getTime()){ InstructionProvider instrProvider = gcodeService.getInstructions(previous.getGCodeContext(), token.getGCodeProvider()); IInstructionSetIterator<GCodeContext, AbstractInstruction> iterator = gcodeService.getIterator(instrProvider, previous.getGCodeContext()); while (iterator.hasNext()) { iterator.next(); } cachedContext = new GCodeContext(iterator.getContext()); updateDate = new Date(); } }catch(GkException e){ LOG.error(e); } } /** * @return the updateDate */ public Date getUpdateDate() { return updateDate; } /** * @param updateDate the updateDate to set */ public void setUpdateDate(Date updateDate) { this.updateDate = updateDate; } /** * @return the gcodeService */ protected IRS274NGCService getGcodeService() { return gcodeService; } /** * @param gcodeService the gcodeService to set */ protected void setGcodeService(IRS274NGCService gcodeService) { this.gcodeService = gcodeService; } /** * @return the cachedContext */ protected GCodeContext getCachedContext() { return cachedContext; } /** * @param cachedContext the cachedContext to set */ protected void setCachedContext(GCodeContext cachedContext) { this.cachedContext = cachedContext; } /** * @return the token */ public ExecutionToken getToken() { return token; } /** * @param token the token to set */ protected void setToken(ExecutionToken token) { this.token = token; } /** * @return the previous */ public LinkedGCodeContextProvider getPrevious() { return previous; } /** * @param previous the previous to set */ public void setPrevious(LinkedGCodeContextProvider previous) { this.previous = previous; } /** * Force update */ public void update() { updateDate = null; } }