/**
* Copyright (C) Intersect 2012.
*
* This module contains Proprietary Information of Intersect,
* and should be treated as Confidential.
*/
package au.org.intersect.exsite9.wizard.metadatacategory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.PlatformUI;
import au.org.intersect.exsite9.domain.Group;
import au.org.intersect.exsite9.domain.MetadataAttribute;
import au.org.intersect.exsite9.domain.MetadataAttributeValue;
import au.org.intersect.exsite9.domain.MetadataCategory;
import au.org.intersect.exsite9.domain.MetadataCategoryType;
import au.org.intersect.exsite9.domain.MetadataCategoryUse;
import au.org.intersect.exsite9.domain.MetadataValue;
import au.org.intersect.exsite9.domain.Project;
import au.org.intersect.exsite9.domain.ResearchFile;
import au.org.intersect.exsite9.domain.utils.AlphabeticalMetadataAttributeValueComparator;
import au.org.intersect.exsite9.service.IGroupService;
import au.org.intersect.exsite9.service.IMetadataCategoryService;
import au.org.intersect.exsite9.service.IResearchFileService;
import au.org.intersect.exsite9.service.ISchemaService;
/**
* Wizard for adding a {@link MetadataCategory} via the {@link AddMetadataCategoryWizardPage1} that is shown to the user
*/
public class AddMetadataCategoryWizard extends Wizard
{
private final AddMetadataCategoryWizardPage1 page1;
private MetadataCategory metadataCategory;
private Project project;
/**
* Constructor
*
* @param project
* @param metadataCategory
* can be null
*/
public AddMetadataCategoryWizard(Project project, MetadataCategory metadataCategory)
{
super();
setNeedsProgressMonitor(true);
this.project = project;
this.metadataCategory = metadataCategory;
if (metadataCategory == null)
{
setWindowTitle("New Metadata Category");
page1 = new AddMetadataCategoryWizardPage1("New Metadata Category",
"Please enter the details of the metadata category you wish to create", project.getSchema(), null,
new ArrayList<MetadataValue>(), new ArrayList<MetadataAttributeValue>());
}
else
{
final List<MetadataAttributeValue> metadataAttribtueValues;
metadataAttribtueValues = new ArrayList<MetadataAttributeValue>();
setWindowTitle("Edit Metadata Category");
if (metadataCategory.getMetadataAttribute() != null)
{
metadataAttribtueValues.addAll(metadataCategory.getMetadataAttribute().getMetadataAttributeValues());
Collections.sort(metadataAttribtueValues, new AlphabeticalMetadataAttributeValueComparator());
}
page1 = new AddMetadataCategoryWizardPage1("Edit Metadata Category",
"Edit the details of the metadata category you have selected", project.getSchema(),
metadataCategory, metadataCategory.getValues(), metadataAttribtueValues);
}
}
@Override
public void addPages()
{
addPage(this.page1);
}
@Override
public boolean performFinish()
{
final String categoryTitle = page1.getMetadataCategoryName();
final String categoryDescription = page1.getCategoryDescription();
final MetadataCategoryType categoryType = page1.getMetadataCategoryType();
final MetadataCategoryUse categoryUse = page1.getMetadataCategoryUse();
final boolean inextensible = page1.getIsInextensible();
// Persist the new metadata category.
final IMetadataCategoryService metadataCategoryService = (IMetadataCategoryService) PlatformUI.getWorkbench()
.getService(IMetadataCategoryService.class);
final IGroupService groupService = (IGroupService) PlatformUI.getWorkbench().getService(IGroupService.class);
final IResearchFileService fileService = (IResearchFileService) PlatformUI.getWorkbench().getService(
IResearchFileService.class);
final ISchemaService schemaService = (ISchemaService) PlatformUI.getWorkbench()
.getService(ISchemaService.class);
for (final ResearchFile assignedFile : page1.getAssignedFiles())
{
fileService.disassociateMultipleMetadataValues(assignedFile, metadataCategory,
page1.getMetadataValuesToBeDisassociated());
}
for (final Group assignedGroup : page1.getAssignedGroups())
{
groupService.disassociateMultipleMetadataValues(assignedGroup, metadataCategory,
page1.getMetadataValuesToBeDisassociated());
}
for (final MetadataAttributeValue mdav : page1.getMetadataAttributeValuesToBeDisassociated())
{
groupService.disassociateMetadataAttributeValue(metadataCategory, mdav);
fileService.disassociateMetadataAttributeValue(metadataCategory, mdav);
}
if (this.metadataCategory == null)
{
final List<MetadataValue> metadataValues;
final MetadataAttribute metadataAttribute;
if (categoryType == MetadataCategoryType.CONTROLLED_VOCABULARY)
{
metadataValues = page1.getMetadataCategoryValues();
metadataAttribute = null;
}
else
{
metadataValues = Collections.emptyList();
final String metadataAttributeName = page1.getMetadataAttributeName();
if (!metadataAttributeName.isEmpty())
{
metadataAttribute = new MetadataAttribute(metadataAttributeName, page1.getMetadataAttributeValues());
}
else
{
metadataAttribute = null;
}
}
final MetadataCategory newCategory = metadataCategoryService.createNewMetadataCategory(categoryTitle,
categoryDescription, categoryType, categoryUse, inextensible, false, metadataValues,
metadataAttribute);
schemaService.addMetadataCategoryToSchema(this.project.getSchema(), newCategory);
}
else
{
final MetadataAttribute oldMDA = this.metadataCategory.getMetadataAttribute();
final MetadataAttribute newMDA;
if (oldMDA != null)
{
final String attrName = page1.getMetadataAttributeName();
if (!attrName.isEmpty())
{
newMDA = oldMDA;
newMDA.setName(page1.getMetadataAttributeName());
newMDA.setMetadataAttributeValues(page1.getMetadataAttributeValues());
}
else
{
newMDA = null;
}
}
else
{
final String attrName = page1.getMetadataAttributeName();
if (!attrName.isEmpty())
{
newMDA = new MetadataAttribute(attrName, page1.getMetadataAttributeValues());
}
else
{
newMDA = null;
}
}
metadataCategoryService.updateMetadataCategory(this.metadataCategory, categoryTitle, categoryDescription,
categoryUse, inextensible, page1.getMetadataCategoryValues(), newMDA);
}
return this.project != null;
}
public Project getProjectWithUpdatedMetadataCategories()
{
return this.project;
}
}