blob: 1f813a0d018d66f685da12edb137ff4ce8124145 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Michael Jastram - initial API and implementation
******************************************************************************/
package org.eclipse.rmf.reqif10.pror.util;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.provider.ItemProviderAdapter;
import org.eclipse.rmf.reqif10.AttributeDefinition;
import org.eclipse.rmf.reqif10.AttributeValue;
import org.eclipse.rmf.reqif10.AttributeValueEnumeration;
import org.eclipse.rmf.reqif10.AttributeValueXHTML;
import org.eclipse.rmf.reqif10.DatatypeDefinition;
import org.eclipse.rmf.reqif10.EnumValue;
import org.eclipse.rmf.reqif10.ReqIF;
import org.eclipse.rmf.reqif10.SpecElementWithAttributes;
import org.eclipse.rmf.reqif10.SpecHierarchy;
import org.eclipse.rmf.reqif10.SpecObjectType;
import org.eclipse.rmf.reqif10.SpecType;
import org.eclipse.rmf.reqif10.Specification;
import org.eclipse.rmf.reqif10.XhtmlContent;
import org.eclipse.rmf.reqif10.common.util.ProrXhtmlSimplifiedHelper;
import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
import org.eclipse.rmf.reqif10.common.util.ReqIFToolExtensionUtil;
import org.eclipse.rmf.reqif10.pror.configuration.Column;
import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationFactory;
import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
import org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration;
import org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration;
import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration;
import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations;
import org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration;
import org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension;
import org.eclipse.rmf.reqif10.util.ReqIF10Switch;
public class ConfigurationUtil {
public static final String DEFAULT_LEFT_HEADER_COLUMN_NAME = "Lead Header Column";
public static final int DEFAULT_LEFT_HEADER_COLUMN_WIDTH = 30;
/**
* @return The Configuration element for the given
* {@link DatatypeDefinition} or null if none is configured.
*/
public static ProrPresentationConfiguration getPresentationConfiguration(
DatatypeDefinition dd) {
ReqIF reqif = ReqIF10Util.getReqIF(dd);
if (reqif == null)
return null;
ProrToolExtension prorToolExtension = getProrToolExtension(reqif);
if (prorToolExtension == null)
return null;
ProrPresentationConfigurations extensions = prorToolExtension
.getPresentationConfigurations();
if (extensions == null)
return null;
for (ProrPresentationConfiguration config : extensions
.getPresentationConfigurations()) {
if (dd.equals(config.getDatatype()))
return config;
}
return null;
}
/**
* Returns the {@link ProrPresentationConfiguration} that is associated with
* the {@link DatatypeDefinition} of the given {@link AttributeValue}. If
* either intermediate element is null, null is returned.
*/
public static ProrPresentationConfiguration getPresentationConfiguration(
AttributeValue av) {
DatatypeDefinition dd = ReqIF10Util.getDatatypeDefinition(av);
if (av != null) {
return getPresentationConfiguration(dd);
}
return null;
}
/**
* Returns the {@link ProrToolExtension} associated with this {@link ReqIF}.
* If it doesn't exist yet, null is returned.
* <p>
*/
public static ProrToolExtension getProrToolExtension(ReqIF reqif) {
if (reqif != null) {
List<ProrToolExtension> extensions = ReqIFToolExtensionUtil
.getToolExtensionsByType(reqif,
ConfigurationPackage.eINSTANCE
.getProrToolExtension());
if (0 < extensions.size()) {
return extensions.get(0);
}
}
return null;
}
/**
* Returns the {@link ProrToolExtension} associated with this {@link ReqIF}.
* If it doesn't exist yet, it is created.
* <p>
*/
public static ProrToolExtension createProrToolExtension(ReqIF reqif,
EditingDomain domain) {
ProrToolExtension extension = getProrToolExtension(reqif);
if (null == extension) {
extension = ConfigurationFactory.eINSTANCE
.createProrToolExtension();
domain.getCommandStack().execute(
ReqIFToolExtensionUtil.getAddToolExtensionCommand(reqif,
extension));
}
return extension;
}
/**
* Returns the left header {@link Column} (which shows the hierarchy level)
* associated with this {@link Specification}. If it doesn't exist yet, it
* is created.
*/
public static Column getLeftHeaderColumn(Specification specification,
EditingDomain domain) {
ProrSpecViewConfiguration specViewConfiguration = createSpecViewConfiguration(
specification, domain);
Column leftHeaderColumn = specViewConfiguration.getLeftHeaderColumn();
if (leftHeaderColumn == null) {
leftHeaderColumn = ConfigurationFactory.eINSTANCE.createColumn();
leftHeaderColumn.setLabel(DEFAULT_LEFT_HEADER_COLUMN_NAME);
leftHeaderColumn.setWidth(DEFAULT_LEFT_HEADER_COLUMN_WIDTH);
specViewConfiguration.setLeftHeaderColumn(leftHeaderColumn);
}
return leftHeaderColumn;
}
/**
* Retrieves all active {@link PresentationEditInterface} instances for the
* given object (which assumes to be part of a ReqIF model). If none is
* found, an empty set is returned.
*/
public static Set<PresentationEditInterface> getPresentationEditInterfaces(
Object obj, AdapterFactory adapterFactory) {
ReqIF reqif = ReqIF10Util.getReqIF(obj);
ProrPresentationConfigurations configs = getPresentationConfigurations(reqif);
if (configs != null) {
Set<PresentationEditInterface> result = new HashSet<PresentationEditInterface>();
for (ProrPresentationConfiguration config : configs
.getPresentationConfigurations()) {
ItemProviderAdapter ip = ProrUtil.getItemProvider(
adapterFactory, config);
if (ip instanceof PresentationEditInterface) {
result.add((PresentationEditInterface) ip);
}
}
return result;
}
return Collections.emptySet();
}
/**
* Finds the best labels, according to what is set in the preferences.
*
* @param specElement
* @param adapterFactory
* @param adapterFactory
* @return
*/
public static String getSpecElementLabel(
SpecElementWithAttributes specElement, AdapterFactory adapterFactory) {
List<String> labels = getDefaultLabels(ReqIF10Util
.getReqIF(specElement));
// Iterate over the list of labels requested
for (String label : labels) {
for (AttributeValue value : specElement.getValues()) {
AttributeDefinition ad = ReqIF10Util
.getAttributeDefinition(value);
if (ad == null)
continue;
if (label.equals(ad.getLongName())) {
ProrPresentationConfiguration config = getPresentationConfig(value);
ItemProviderAdapter ip = ProrUtil.getItemProvider(
adapterFactory, config);
if (ip instanceof PresentationEditInterface) {
String customLabel = ((PresentationEditInterface) ip)
.getLabel(value);
if (customLabel != null)
return customLabel;
}
Object result = ReqIF10Util.getTheValue(value);
if (result != null) {
// If we have an enumeration attribute
if (value instanceof AttributeValueEnumeration
&& result instanceof EList) {
EList<?> list = (EList<?>) result;
if (!list.isEmpty())
return ((EnumValue) list.get(0)).getLongName();
else
return "";
} else if (value instanceof AttributeValueXHTML
&& result instanceof XhtmlContent) {
XhtmlContent content = (XhtmlContent) result;
String text = ProrXhtmlSimplifiedHelper
.xhtmlToSimplifiedString(content);
// Ignore empty XHTML
if (text.trim().length() == 0) {
continue;
}
// Shorten long XHTML
if (text.length() > 20)
text = text.substring(0, 17) + "...";
return text;
}
return result.toString();
}
}
}
}
return specElement.getIdentifier();
}
/**
* Returns the list of default Label names.
*
* @return always a list, sometimes empty.
*/
public static List<String> getDefaultLabels(ReqIF reqif) {
ProrToolExtension extension = getProrToolExtension(reqif);
if (extension == null) {
return Collections.emptyList();
}
ProrGeneralConfiguration generalConfig = extension
.getGeneralConfiguration();
if (generalConfig == null) {
return Collections.emptyList();
}
LabelConfiguration labelConfig = generalConfig.getLabelConfiguration();
if (labelConfig == null) {
return Collections.emptyList();
}
return labelConfig.getDefaultLabel();
}
/**
* Retrieves the {@link ProrSpecViewConfiguration} for the given
* {@link Specification}. If none exists, it is built. The builder collects
* all attribute names of all SpecObjects and creates corresponding columns.
*/
public static ProrSpecViewConfiguration createSpecViewConfiguration(
Specification specification, EditingDomain domain) {
ProrToolExtension extension = createProrToolExtension(ReqIF10Util.getReqIF(specification), domain);
EList<ProrSpecViewConfiguration> configs = extension
.getSpecViewConfigurations();
for (ProrSpecViewConfiguration config : configs) {
if (config.getSpecification() != null
&& config.getSpecification().equals(specification)) {
return config;
}
}
// None found, let's build a new one that includes all attribute names.
ProrSpecViewConfiguration specViewConfig = ConfigurationFactory.eINSTANCE
.createProrSpecViewConfiguration();
specViewConfig.setSpecification(specification);
// Collect all Types
final List<SpecType> types = new ArrayList<SpecType>();
ReqIF10Switch<SpecHierarchy> visitor = new ReqIF10Switch<SpecHierarchy>() {
@Override
public SpecHierarchy caseSpecHierarchy(SpecHierarchy specHierarchy) {
if (specHierarchy.getObject() != null) {
SpecObjectType type = specHierarchy.getObject().getType();
if (type != null && !types.contains(type)) {
types.add(type);
}
}
return specHierarchy;
}
};
int counter = 0;
for (Iterator<EObject> i = EcoreUtil
.getAllContents(specification, true); i.hasNext();) {
visitor.doSwitch(i.next());
// we only explore the first 50 elements for performance.
if (counter++ == 50)
break;
}
// Collect all names from the types. We use a list to maintain order.
final List<String> colNames = new ArrayList<String>();
for (SpecType type : types) {
for (AttributeDefinition ad : type.getSpecAttributes()) {
String colName = ad.getLongName();
if (colName != null && !colNames.contains(colName)) {
colNames.add(ad.getLongName());
}
}
}
// Build all Columns from the names
boolean unifiedColumn = false;
for (String colName : colNames) {
Column column = ConfigurationFactory.eINSTANCE.createColumn();
// See whether we need a unified column or not.
if (colName.equals("ReqIF.Text") || colName.equals("ReqIF.ChapterName")) {
if (unifiedColumn) continue;
column = ConfigurationFactory.eINSTANCE.createUnifiedColumn();
colName = "Main";
unifiedColumn = true;
}
column.setWidth(100);
column.setLabel(colName);
specViewConfig.getColumns().add(column);
}
domain.getCommandStack()
.execute(
AddCommand
.create(domain,
extension,
ConfigurationPackage.Literals.PROR_TOOL_EXTENSION__SPEC_VIEW_CONFIGURATIONS,
specViewConfig));
return specViewConfig;
}
public static ProrPresentationConfiguration getPresentationConfig(
AttributeValue value) {
DatatypeDefinition dd = ReqIF10Util.getDatatypeDefinition(value);
ProrPresentationConfiguration config = getPresentationConfiguration(dd);
return config;
}
/**
* @return the {@link ProrPresentationConfigurations} for the given
* {@link ReqIf} and {@link EditingDomain}.
*/
public static ProrPresentationConfigurations getPresentationConfigurations(
ReqIF reqif) {
ProrToolExtension uiExtension = ConfigurationUtil
.getProrToolExtension(reqif);
return uiExtension == null ? null : uiExtension
.getPresentationConfigurations();
}
/**
* If a ReqIF has no labels yet, this method configures some smart defaults.
*/
public static void setDefaultLabelsIfNecessary(
AdapterFactory adapterFactory, EditingDomain editingDomain,
ReqIF reqif) {
CompoundCommand cmd = new CompoundCommand();
ProrToolExtension extension = createProrToolExtension(reqif,
editingDomain);
ProrGeneralConfiguration generalConfig = extension
.getGeneralConfiguration();
if (generalConfig == null) {
generalConfig = ConfigurationFactory.eINSTANCE
.createProrGeneralConfiguration();
cmd.append(SetCommand
.create(editingDomain,
extension,
ConfigurationPackage.Literals.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION,
generalConfig));
}
LabelConfiguration labelConfig = generalConfig.getLabelConfiguration();
if (labelConfig == null) {
labelConfig = ConfigurationFactory.eINSTANCE
.createLabelConfiguration();
cmd.append(SetCommand
.create(editingDomain,
generalConfig,
ConfigurationPackage.Literals.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION,
labelConfig));
} else {
// If there is already a label configuration, we leave it alone.
return;
}
labelConfig.getDefaultLabel().add("ReqIF.ChapterNumber");
labelConfig.getDefaultLabel().add("ReqIF.ChapterName");
labelConfig.getDefaultLabel().add("ReqIF.Name");
labelConfig.getDefaultLabel().add("ReqIF.Text");
labelConfig.getDefaultLabel().add("ID");
labelConfig.getDefaultLabel().add("Name");
labelConfig.getDefaultLabel().add("Description");
editingDomain.getCommandStack().execute(cmd);
}
}