/*
* Copyright (c) 2012 Data Harmonisation Panel
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* HUMBOLDT EU Integrated Project #030962
* Data Harmonisation Panel <http://www.dhpanel.eu>
*/
package eu.esdihumboldt.hale.common.align.model.impl;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Multimaps;
import eu.esdihumboldt.hale.common.align.extension.annotation.AnnotationExtension;
import eu.esdihumboldt.hale.common.align.model.AnnotationDescriptor;
import eu.esdihumboldt.hale.common.align.model.Cell;
import eu.esdihumboldt.hale.common.align.model.CellUtil;
import eu.esdihumboldt.hale.common.align.model.Entity;
import eu.esdihumboldt.hale.common.align.model.MutableCell;
import eu.esdihumboldt.hale.common.align.model.ParameterValue;
import eu.esdihumboldt.hale.common.align.model.Priority;
import eu.esdihumboldt.hale.common.align.model.TransformationMode;
/**
* Default implementation of an alignment cell
*
* @author Simon Templer
*/
public class DefaultCell implements Cell, MutableCell {
private ListMultimap<String, ? extends Entity> source;
private ListMultimap<String, ? extends Entity> target;
private ListMultimap<String, ParameterValue> parameters;
private String transformation;
private String id;
/**
* The cell's transformation mode, defaults to active.
*/
private TransformationMode mode = DEFAULT_TRANSFORMATION_MODE;
/**
* The {@link Cell}'s {@link Priority}. Defaults to {@link Priority#NORMAL}.
*/
private Priority priority = Priority.NORMAL;
private final Set<String> disabledFor = new HashSet<String>();
private boolean baseCell = false;
private final ListMultimap<String, String> documentation = ArrayListMultimap.create();
private final ListMultimap<String, Object> annotations = ArrayListMultimap.create();
/**
* Default constructor.
*/
public DefaultCell() {
// do nothing
}
/**
* Copy constructor.
*
* @param copy the cell to copy
*/
public DefaultCell(Cell copy) {
for (String annotationType : copy.getAnnotationTypes())
annotations.putAll(annotationType, copy.getAnnotations(annotationType));
disabledFor.addAll(copy.getDisabledFor());
documentation.putAll(copy.getDocumentation());
id = copy.getId();
priority = copy.getPriority();
mode = copy.getTransformationMode();
// since source, target and parameter maps may not be modified
// assignment is okay
source = copy.getSource();
target = copy.getTarget();
parameters = copy.getTransformationParameters();
transformation = copy.getTransformationIdentifier();
baseCell = copy.isBaseCell();
}
/**
* @see eu.esdihumboldt.hale.common.align.model.MutableCell#setTransformationIdentifier(java.lang.String)
*/
@Override
public void setTransformationIdentifier(String transformation) {
this.transformation = transformation;
}
/**
* @see eu.esdihumboldt.hale.common.align.model.MutableCell#setTransformationParameters(ListMultimap)
*/
@Override
public void setTransformationParameters(ListMultimap<String, ParameterValue> parameters) {
this.parameters = parameters;
}
/**
* @see eu.esdihumboldt.hale.common.align.model.MutableCell#setSource(com.google.common.collect.ListMultimap)
*/
@Override
public void setSource(ListMultimap<String, ? extends Entity> source) {
this.source = source;
}
/**
* @see eu.esdihumboldt.hale.common.align.model.MutableCell#setTarget(com.google.common.collect.ListMultimap)
*/
@Override
public void setTarget(ListMultimap<String, ? extends Entity> target) {
this.target = target;
}
/**
* @see Cell#getSource()
*/
@Override
public ListMultimap<String, ? extends Entity> getSource() {
if (source == null) {
return null;
}
return Multimaps.unmodifiableListMultimap(source);
}
/**
* @see Cell#getTarget()
*/
@Override
public ListMultimap<String, ? extends Entity> getTarget() {
if (target == null) {
return null;
}
return Multimaps.unmodifiableListMultimap(target);
}
/**
* @see Cell#getTransformationParameters()
*/
@Override
public ListMultimap<String, ParameterValue> getTransformationParameters() {
if (parameters == null) {
return null;
}
return Multimaps.unmodifiableListMultimap(parameters);
}
/**
* Add an annotation object.
*
* @param type the annotation type
* @param annotation the annotation object
*/
public void addAnnotation(String type, Object annotation) {
annotations.put(type, annotation);
}
@Override
public List<?> getAnnotations(String type) {
return Collections.unmodifiableList(annotations.get(type));
}
@Override
public Object addAnnotation(String type) {
AnnotationDescriptor<?> descriptor = AnnotationExtension.getInstance().get(type);
if (descriptor != null) {
// add and return the new annotation object
Object annotation = descriptor.create();
annotations.put(type, annotation);
return annotation;
}
return null;
}
@Override
public Set<String> getAnnotationTypes() {
return Collections.unmodifiableSet(annotations.keySet());
}
@Override
public void removeAnnotation(String type, Object annotation) {
annotations.remove(type, annotation);
}
@Override
public ListMultimap<String, String> getDocumentation() {
return documentation;
}
/**
* @see Cell#getTransformationIdentifier()
*/
@Override
public String getTransformationIdentifier() {
return transformation;
}
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
try {
return CellUtil.getCellDescription(this, null);
} catch (Throwable e) {
return super.toString();
}
}
/**
* @see eu.esdihumboldt.hale.common.align.model.Cell#getId()
*/
@Override
public String getId() {
return id;
}
/**
* @see eu.esdihumboldt.hale.common.align.model.MutableCell#setId(String)
*/
@Override
public void setId(String id) {
this.id = id;
}
/**
* @see eu.esdihumboldt.hale.common.align.model.MutableCell#setDisabledFor(eu.esdihumboldt.hale.common.align.model.Cell,
* boolean)
*/
@Override
public void setDisabledFor(String cellId, boolean disabled) {
if (disabled)
disabledFor.add(cellId);
else
disabledFor.remove(cellId);
}
/**
* @see eu.esdihumboldt.hale.common.align.model.Cell#getDisabledFor()
*/
@Override
public Set<String> getDisabledFor() {
return Collections.unmodifiableSet(disabledFor);
}
/**
* @see eu.esdihumboldt.hale.common.align.model.MutableCell#setPriority(eu.esdihumboldt.hale.common.align.model.Priority)
*/
@Override
public void setPriority(Priority priority) {
this.priority = priority;
}
/**
* @see eu.esdihumboldt.hale.common.align.model.Cell#getPriority()
*/
@Override
public Priority getPriority() {
return priority;
}
@Override
public void setTransformationMode(TransformationMode mode) {
this.mode = mode;
}
@Override
public TransformationMode getTransformationMode() {
return mode;
}
/**
* @see eu.esdihumboldt.hale.common.align.model.Cell#isBaseCell()
*/
@Override
public boolean isBaseCell() {
return baseCell;
}
}