/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.foundation.rm;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jdom2.Document;
import org.jdom2.Element;
import org.openflexo.foundation.utils.FlexoProgress;
import org.openflexo.foundation.utils.FlexoProjectFile;
import org.openflexo.foundation.utils.ProjectLoadingCancelledException;
import org.openflexo.foundation.utils.ProjectLoadingHandler;
import org.openflexo.foundation.wkf.FlexoProcess;
import org.openflexo.foundation.wkf.FlexoProcessNode;
import org.openflexo.foundation.wkf.FlexoWorkflow;
import org.openflexo.foundation.xml.FlexoWorkflowBuilder;
import org.openflexo.foundation.xml.XMLUtils;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.toolbox.FlexoVersion;
/**
* Please comment this class
*
* @author sguerin
*
*/
public class FlexoWorkflowResource extends FlexoXMLStorageResource<FlexoWorkflow> {
private static final Logger logger = Logger.getLogger(FlexoWorkflowResource.class.getPackage().getName());
private String projectURI;
private ResourceType resourceType = ResourceType.WORKFLOW;
private String name;
private boolean useProjectName;
/**
* Constructor used for XML Serialization: never try to instanciate resource from this constructor
*
* @param builder
*/
public FlexoWorkflowResource(FlexoProjectBuilder builder) {
this(builder.project);
builder.notifyResourceLoading(this);
}
private FlexoWorkflowResource(FlexoProject aProject) {
super(aProject);
}
public FlexoWorkflowResource(FlexoProject aProject, FlexoWorkflow workflow, FlexoProjectFile workflowFile)
throws InvalidFileNameException {
this(aProject);
_resourceData = workflow;
setResourceFile(workflowFile);
workflow.setFlexoResource(this);
}
public FlexoWorkflowResource(FlexoProject aProject, FlexoWorkflow workflow, FlexoProjectFile workflowFile, ResourceType resourceType,
String name) throws InvalidFileNameException {
this(aProject);
this.resourceType = resourceType;
this.name = name;
this._resourceData = workflow;
setResourceFile(workflowFile);
}
@Override
public ResourceType getResourceType() {
return resourceType;
}
public void setResourceType(ResourceType resourceType) {
this.resourceType = resourceType;
}
public void replaceWithWorkflow(FlexoWorkflow workflow) {
_resourceData = workflow;
setChanged();
}
@Override
public String getName() {
if (name != null) {
return name;
}
return getProject().getProjectName();
}
@Override
public void setName(String aName) {
this.name = aName;
}
public boolean isUseProjectName() {
return useProjectName;
}
public void setUseProjectName(boolean useProjectName) {
this.useProjectName = useProjectName;
if (useProjectName) {
name = null;
}
}
@Override
public Class getResourceDataClass() {
return FlexoWorkflow.class;
}
@Override
public FlexoWorkflow performLoadResourceData(FlexoProgress progress, ProjectLoadingHandler loadingHandler)
throws LoadXMLResourceException, FlexoFileNotFoundException, ProjectLoadingCancelledException, MalformedXMLException {
FlexoWorkflow workflow;
if (progress != null) {
progress.setProgress(FlexoLocalization.localizedForKey("loading_workflow"));
}
if (logger.isLoggable(Level.FINE)) {
logger.fine("loadResourceData() in FlexoWorkflowResource");
}
workflow = super.performLoadResourceData(progress, loadingHandler);
// Load all processes
if (progress != null) {
progress.setProgress(FlexoLocalization.localizedForKey("loading_processes"));
progress.resetSecondaryProgress(project.getFlexoWorkflow().allLocalProcessesCount());
}
if (!isCache()) {
loadProcesses(progress, workflow, workflow.allImportedProcessNodes());
loadProcesses(progress, workflow, workflow.allLocalProcessNodes());
for (Enumeration<FlexoProcessNode> e = workflow.allLocalProcessNodes(); e.hasMoreElements();) {
FlexoProcessNode nextProcessNode = e.nextElement();
FlexoProcess next = nextProcessNode.getProcess();
if (next != null) {
if (next.getProcessDMEntity() != null) {
next.getProcessDMEntity().updateParentProcessPropertyIfRequired();
}
next.finalizeProcessBindings();
next.resolveObjectReferences();
next.clearIsModified(true);
next.setLastUpdate(null);// resets last update date.
} else {
if (logger.isLoggable(Level.SEVERE)) {
logger.severe("No FlexoProcess linked with processsNode : '" + nextProcessNode.getName()
+ "' !!! Could not load process, removing process node !");
}
nextProcessNode.delete();
}
}
}
return workflow;
}
public boolean isCache() {
return getProjectURI() != null && !getProjectURI().equals(getProject().getURI());
}
@Override
protected void saveResourceData(boolean clearIsModified)
throws org.openflexo.foundation.rm.FlexoXMLStorageResource.SaveXMLResourceException, SaveResourcePermissionDeniedException {
super.saveResourceData(clearIsModified && getResourceData().getProject() == getProject());
}
/**
* @param progress
* @param workflow
*/
private void loadProcesses(FlexoProgress progress, FlexoWorkflow workflow, Enumeration<FlexoProcessNode> en) {
for (; en.hasMoreElements();) {
FlexoProcessNode next = en.nextElement();
if (progress != null) {
progress.setSecondaryProgress(FlexoLocalization.localizedForKey("loading_process") + " " + next.getName());
}
if (project.getFlexoProcessResource(next.getProcessResourceName()) != null) {
FlexoProcess process = project.getFlexoProcessResource(next.getProcessResourceName()).getResourceData();
next.setProcess(process);
}
}
}
/**
* Manually converts resource file from version v1 to version v2. This method implements conversion from v0.1 to v1.0
*
* @param v1
* @param v2
* @return boolean indicating if conversion was successful
*/
@Override
protected boolean convertResourceFileFromVersionToVersion(FlexoVersion vers1, FlexoVersion vers2) {
if (vers1.equals(new FlexoVersion("0.1")) && vers2.equals(new FlexoVersion("1.0"))) {
try {
if (logger.isLoggable(Level.INFO)) {
logger.info("Start converting from 0.1 to 1.0");
}
Document _document = null;
Element root_Element = null;
_document = XMLUtils.getJDOMDocument(getResourceFile().getFile());
root_Element = _document.getRootElement();
Element newWorkflowElement = new Element("flexoworkflow");
newWorkflowElement.setAttribute("workflowName", getName());
newWorkflowElement.setContent(root_Element.clone());
_document.setRootElement(newWorkflowElement);
FileWritingLock lock = willWriteOnDisk();
if (logger.isLoggable(Level.INFO)) {
logger.info("Conversion from 0.1 to 1.0 SUCCESSFULL. Save the file.");
}
boolean returned = XMLUtils.saveXMLFile(_document, getResourceFile().getFile());
hasWrittenOnDisk(lock);
return returned;
} catch (Exception e) {
// Warns about the exception
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Exception raised: " + e.getClass().getName() + ". See console for details.");
}
e.printStackTrace();
}
return false;
} else if (vers2.equals("2.1")) {
FlexoWorkflow wkf = getResourceData();
wkf.createDefaultProcessMetricsDefinitions();
wkf.createDefaultActivityMetricsDefinitions();
wkf.createDefaultOperationMetricsDefinitions();
wkf.createDefaultEdgeMetricsDefinitions();
try {
getResourceData().save();
getProject().save();
} catch (SaveResourceException e) {
e.printStackTrace();
}
return true;
} else {
return super.convertResourceFileFromVersionToVersion(vers1, vers2);
}
}
@Override
public Object instanciateNewBuilder() {
FlexoWorkflowBuilder builder = new FlexoWorkflowBuilder(this);
builder.workflow = _resourceData;
return builder;
}
@Override
public boolean hasBuilder() {
return true;
}
@Override
protected boolean isDuplicateSerializationIdentifierRepairable() {
return false;
}
@Override
protected boolean repairDuplicateSerializationIdentifier() {
return false;
}
public String getProjectURI() {
return projectURI;
}
public void setProjectURI(String projectURI) {
this.projectURI = projectURI;
}
}