/* * 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.io.oml.helper; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import com.google.common.base.Joiner; import eu.esdihumboldt.hale.common.align.io.impl.internal.CellBean; import eu.esdihumboldt.hale.common.align.io.impl.internal.ChildContextBean; import eu.esdihumboldt.hale.common.align.io.impl.internal.NamedEntityBean; import eu.esdihumboldt.hale.common.align.io.impl.internal.ParameterValueBean; import eu.esdihumboldt.hale.common.align.io.impl.internal.PropertyBean; import eu.esdihumboldt.hale.common.align.model.functions.FormattedStringFunction; import eu.esdihumboldt.hale.common.core.io.report.IOReporter; import eu.esdihumboldt.hale.io.oml.internal.goml.rdf.DetailedAbout; import eu.esdihumboldt.hale.io.oml.internal.model.align.ICell; /** * Class to translate concatenation of attributes to the formatted string * function * * @author Kevin Mais */ @SuppressWarnings("restriction") public class FormattedStringTranslator implements FunctionTranslator, FormattedStringFunction { private static final String INTERNALSEPERATOR = "--!-split-!--"; //$NON-NLS-1$ private static final String SEPARATOR = "seperator"; //$NON-NLS-1$ private static final String CONCATENATION = "concatenation"; //$NON-NLS-1$ /** * @see eu.esdihumboldt.hale.io.oml.helper.FunctionTranslator#getTransformationId() */ @Override public String getTransformationId() { return ID; } /** * @see eu.esdihumboldt.hale.io.oml.helper.FunctionTranslator#getNewParameters(java.util.List, * eu.esdihumboldt.hale.common.align.io.impl.internal.CellBean, * eu.esdihumboldt.hale.common.core.io.report.IOReporter, * eu.esdihumboldt.hale.io.oml.internal.model.align.ICell) */ @Override public List<ParameterValueBean> getNewParameters(List<ParameterValueBean> params, CellBean cellBean, IOReporter reporter, ICell cell) { List<ParameterValueBean> newList = new ArrayList<ParameterValueBean>(); String separator = ""; // default separator String concatenation = ""; for (ParameterValueBean val : params) { // get original separator parameter if (val.getName().equals(SEPARATOR)) { separator = val.getValue(); } // get original concatenation parameter if (val.getName().equals(CONCATENATION)) { concatenation = val.getValue(); } } String[] concat = concatenation.split(INTERNALSEPERATOR); List<NamedEntityBean> src = cellBean.getSource(); // create list of valid source variables Set<String> sourceVars = new HashSet<String>(); for (NamedEntityBean bean : src) { if (bean.getEntity() instanceof PropertyBean) { List<ChildContextBean> props = ((PropertyBean) bean.getEntity()).getProperties(); String[] children = new String[props.size()]; for (int i = 0; i < props.size(); i++) { children[i] = props.get(i).getChildName().getLocalPart(); } sourceVars.add(Joiner.on('.').join(children)); } } StringBuffer pattern = new StringBuffer(); boolean first = true; for (String thisElement : concat) { // append separator between elements if (first) { first = false; } else { pattern.append(separator); } String[] properties = thisElement.split(String .valueOf(DetailedAbout.PROPERTY_DELIMITER)); String varString = Joiner.on('.').join(properties); if (sourceVars.contains(varString)) { // thisElement represents a variable pattern.append('{'); pattern.append(varString); pattern.append('}'); } else { // thisElement is just a string pattern.append(thisElement); // TODO any escaping of {? } } // add pattern parameter newList.add(new ParameterValueBean(PARAMETER_PATTERN, pattern.toString())); return newList; } }