package org.goko.gcode.rs274ngcv3.ui.workspace; import java.util.ArrayList; import java.util.List; import org.apache.commons.collections.CollectionUtils; import org.goko.core.common.exception.GkException; import org.goko.core.common.io.xml.IXmlPersistenceService; import org.goko.core.common.service.IGokoService; import org.goko.core.gcode.element.IGCodeProvider; import org.goko.core.gcode.rs274ngcv3.IRS274NGCService; import org.goko.core.gcode.rs274ngcv3.element.GCodeProvider; import org.goko.core.gcode.rs274ngcv3.element.IModifier; import org.goko.core.log.GkLog; import org.goko.core.workspace.io.IProjectLocation; import org.goko.core.workspace.io.XmlProjectContainer; import org.goko.core.workspace.service.IMapperService; import org.goko.core.workspace.service.IProjectSaveParticipant; import org.goko.core.workspace.service.IWorkspaceService; import org.goko.gcode.rs274ngcv3.ui.workspace.io.XmlRS274GContent; import org.goko.gcode.rs274ngcv3.xml.bean.XmlGCodeModifier; import org.goko.gcode.rs274ngcv3.xml.bean.XmlGCodeProvider; import org.goko.gcode.rs274ngcv3.xml.bean.source.XmlGCodeProviderSource; public class RS274SaveParticipant implements IProjectSaveParticipant<XmlRS274GContent> , IGokoService { /** LOG */ private static final GkLog LOG = GkLog.getLogger(RS274SaveParticipant.class); /** Service ID */ private static final String SERVICE_ID = "org.goko.gcode.rs274ngcv3.ui.workspace.RS274SaveParticipant"; /** Type of the RS274 content container */ private static final String RS274_CONTENT_TYPE = "rs274Content"; /** Name of the RS274 content file */ private static final String RS274_CONTENT_FILE_NAME = "rs274Content.xml"; /** Workspace service */ private IRS274NGCService gcodeService; /** Workspace service */ private IWorkspaceService workspaceService; /** XML persistence service */ private IXmlPersistenceService xmlPersistenceService; private IMapperService mapperService; /** Dirty state of the content */ private boolean dirty; /** (inheritDoc) * @see org.goko.core.common.service.IGokoService#getServiceId() */ @Override public String getServiceId() throws GkException { return SERVICE_ID; } /** (inheritDoc) * @see org.goko.core.common.service.IGokoService#start() */ @Override public void start() throws GkException { LOG.info("Starting "+getServiceId()); xmlPersistenceService.register(XmlRS274GContent.class); LOG.info("Successfully started "+getServiceId()); } /** (inheritDoc) * @see org.goko.core.common.service.IGokoService#stop() */ @Override public void stop() throws GkException { // TODO Auto-generated method stub } /** (inheritDoc) * @see org.goko.core.workspace.service.IProjectSaveParticipant#isDirty() */ @Override public boolean isDirty() { return dirty; } /** (inheritDoc) * @see org.goko.core.workspace.service.IProjectSaveParticipant#save(org.goko.core.workspace.io.IProjectOutputLocation) */ @Override public List<XmlProjectContainer> save(IProjectLocation output) throws GkException { List<XmlProjectContainer> containers = new ArrayList<XmlProjectContainer>(); XmlRS274GContent content = persistContent(/*new File(context.getResourcesFolder(), RS274_CONTENT_FILE_NAME)*/); containers.add(content); return containers; } private XmlRS274GContent persistContent() throws GkException{ XmlRS274GContent content = new XmlRS274GContent(); List<IGCodeProvider> lstProviders = gcodeService.getGCodeProvider(); ArrayList<XmlGCodeProvider> lstXmlProvider = new ArrayList<XmlGCodeProvider>(); for (IGCodeProvider igCodeProvider : lstProviders) { XmlGCodeProvider xmlProvider = new XmlGCodeProvider(); xmlProvider.setCode(igCodeProvider.getCode()); xmlProvider.setSource(mapperService.export(igCodeProvider.getSource(), XmlGCodeProviderSource.class)); // Persist the modifiers of this provider persistModifiers(xmlProvider, igCodeProvider); lstXmlProvider.add(xmlProvider); } content.setLstGCodeProvider(lstXmlProvider); return content; } private void persistModifiers(XmlGCodeProvider xmlProvider, IGCodeProvider provider) throws GkException{ List<IModifier<GCodeProvider>> lstModifiers = gcodeService.getModifierByGCodeProvider(provider.getId()); ArrayList<XmlGCodeModifier> modifiers = null; if(CollectionUtils.isNotEmpty(lstModifiers)){ modifiers = new ArrayList<>(); for (IModifier<GCodeProvider> iModifier : lstModifiers) { XmlGCodeModifier modifier = mapperService.export(iModifier, XmlGCodeModifier.class); modifiers.add(modifier); } } xmlProvider.setModifiers(modifiers); } /** (inheritDoc) * @see org.goko.core.workspace.service.IProjectSaveParticipant#rollback() */ @Override public void rollback() { // TODO Auto-generated method stub } /** (inheritDoc) * @see org.goko.core.workspace.service.IProjectSaveParticipant#saveComplete() */ @Override public void saveComplete() { this.dirty = false; } /** * @return the workspaceService */ public IWorkspaceService getWorkspaceService() { return workspaceService; } /** * @param workspaceService the workspaceService to set */ public void setWorkspaceService(IWorkspaceService workspaceService) { this.workspaceService = workspaceService; } /** * @return the gcodeService */ public IRS274NGCService getGcodeService() { return gcodeService; } /** * @param gcodeService the gcodeService to set */ public void setGcodeService(IRS274NGCService gcodeService) { this.gcodeService = gcodeService; } /** * @return the xmlPersistenceService */ public IXmlPersistenceService getXmlPersistenceService() { return xmlPersistenceService; } /** * @param xmlPersistenceService the xmlPersistenceService to set */ public void setXmlPersistenceService(IXmlPersistenceService xmlPersistenceService) { this.xmlPersistenceService = xmlPersistenceService; } /** * @return the mapperService */ public IMapperService getMapperService() { return mapperService; } /** * @param mapperService the mapperService to set */ public void setMapperService(IMapperService mapperService) { this.mapperService = mapperService; } }