package org.openflexo.module; import java.io.File; import javax.swing.JFileChooser; import org.openflexo.ApplicationContext; import org.openflexo.components.ProjectChooserComponent; import org.openflexo.foundation.FlexoEditor; import org.openflexo.foundation.resource.FlexoResource; import org.openflexo.foundation.resource.UserResourceCenter.FlexoFileResource; import org.openflexo.foundation.rm.FlexoProject; import org.openflexo.foundation.rm.FlexoProject.FlexoProjectReferenceLoader; import org.openflexo.foundation.rm.FlexoProjectReference; import org.openflexo.foundation.utils.ProjectInitializerException; import org.openflexo.foundation.utils.ProjectLoadingCancelledException; import org.openflexo.localization.FlexoLocalization; import org.openflexo.view.FlexoFrame; import org.openflexo.view.controller.FlexoController; public class InteractiveFlexoProjectReferenceLoader implements FlexoProjectReferenceLoader { private ApplicationContext applicationContext; public InteractiveFlexoProjectReferenceLoader(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } public ApplicationContext getApplicationContext() { return applicationContext; } @Override public FlexoProject loadProject(FlexoProjectReference ref, boolean silentlyOnly) { boolean retrievedFromResourceCenter = false; FlexoResource<FlexoProject> retrievedResource = getApplicationContext().getResourceCenterService().getUserResourceCenter() .retrieveResource(ref.getURI(), ref.getVersion(), ref.getResourceDataClass(), null); File selectedFile = null; if (retrievedResource instanceof FlexoFileResource) { selectedFile = ((FlexoFileResource<?>) retrievedResource).getFile(); retrievedFromResourceCenter = true; } ProjectChooserComponent projectChooser = null; while (true) { if (selectedFile == null || !selectedFile.exists()) { if (silentlyOnly) { return null; } if (projectChooser == null) { projectChooser = new ProjectChooserComponent(FlexoFrame.getActiveFrame()) { }; projectChooser.setOpenMode(); projectChooser.setTitle(FlexoLocalization.localizedForKey("locate_project") + " " + ref.getName() + " " + ref.getVersion()); } int ret = projectChooser.showOpenDialog(); if (ret == JFileChooser.APPROVE_OPTION) { selectedFile = projectChooser.getSelectedFile(); retrievedFromResourceCenter = false; } else { return null; } } boolean openedProject = applicationContext.getProjectLoader().hasEditorForProjectDirectory(selectedFile); if (!openedProject && silentlyOnly) { return null; } FlexoEditor editor = null; try { editor = applicationContext.getProjectLoader().loadProject(selectedFile, true); } catch (ProjectLoadingCancelledException e) { return null; } catch (ProjectInitializerException e) { e.printStackTrace(); if (!retrievedFromResourceCenter) { FlexoController.notify(FlexoLocalization.localizedForKey("could_not_load_project_at") + " " + selectedFile.getAbsolutePath()); selectedFile = null; } } FlexoProject project = editor.getProject(); if (project.getProjectURI().equals(ref.getURI())) { // Project URI do match boolean versionEqual = project.getVersion() == null && ref.getVersion() == null || project.getVersion() != null && project.getVersion().equals(ref.getVersion()); if (versionEqual) { return project; } else { boolean ok = FlexoController.confirm(FlexoLocalization.localizedForKey("project_version_do_not_match") + ". " + project.getVersion() + " " + FlexoLocalization.localizedForKey("was_found") + FlexoLocalization.localizedForKey("but") + " " + ref.getVersion() + " " + FlexoLocalization.localizedForKey("was_expected") + "\n" + FlexoLocalization.localizedForKey("would_you_like_to_switch_to_version:") + " " + project.getVersion()); if (ok) { return project; } else if (!openedProject) { applicationContext.getProjectLoader().closeProject(project); } } } else { if (retrievedFromResourceCenter) { selectedFile = null; continue; } FlexoController.notify(FlexoLocalization.localizedForKey("project_uri_do_not_match") + ".\n" + FlexoLocalization.localizedForKey("uri") + " " + project.getProjectURI() + " " + FlexoLocalization.localizedForKey("was_found") + "\n" + FlexoLocalization.localizedForKey("but") + " " + ref + " " + FlexoLocalization.localizedForKey("was_expected")); } selectedFile = null; } } }