/* * Carrot2 project. * * Copyright (C) 2002-2016, Dawid Weiss, Stanisław Osiński. * All rights reserved. * * Refer to the full license file "carrot2.LICENSE" * in the root folder of the repository checkout or at: * http://www.carrot2.org/carrot2.LICENSE */ package org.carrot2.workbench.core.ui; import java.io.*; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.carrot2.core.attribute.Processing; import org.carrot2.util.attribute.*; import org.carrot2.workbench.core.WorkbenchCorePlugin; import org.carrot2.workbench.core.helpers.Utils; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.ui.IElementFactory; import org.eclipse.ui.IMemento; /** * Factory storing and restoring {@link SearchInput} instances from {@link IMemento}. */ public final class SearchInputFactory implements IElementFactory { private static final String ID_ATTRIBUTE = "id"; private static final String ALGORITHM_ELEMENT = "algorithm"; private static final String SOURCE_ELEMENT = "source"; private static final String ATTRIBUTES_ELEMENT = "attributes"; /** * Public identifier of this {@link IElementFactory}. */ public static final String ID = "org.carrot2.workbench.core.searchParametersFactory"; /* * */ public IAdaptable createElement(IMemento memento) { String source = tryGetStringFrom(memento, SOURCE_ELEMENT, ID_ATTRIBUTE); String algorithm = tryGetStringFrom(memento, ALGORITHM_ELEMENT, ID_ATTRIBUTE); if (StringUtils.isBlank(source) || StringUtils.isBlank(algorithm)) { return null; } final SearchInput search; AttributeValueSet attributes = null; try { IMemento attMemento = memento.getChild(ATTRIBUTES_ELEMENT); if (attMemento != null) { String data = attMemento.getTextData(); if (data != null) { final AttributeValueSets sets = AttributeValueSets .deserialize(new ByteArrayInputStream(data.getBytes("UTF-8"))); attributes = sets.getDefaultAttributeValueSet(); } } } catch (Exception e) { Utils.logError(e, false); } if (attributes == null) { attributes = new AttributeValueSet("defaults"); } search = new SearchInput(source, algorithm, attributes); return search; } private String tryGetStringFrom(IMemento memento, String elementName, String attributeName) { IMemento child = memento.getChild(elementName); if (child != null) { return child.getString(attributeName); } return null; } static void saveState(SearchInput search, IMemento memento) { memento.createChild(SOURCE_ELEMENT).putString(ID_ATTRIBUTE, search.getSourceId()); memento.createChild(ALGORITHM_ELEMENT).putString(ID_ATTRIBUTE, search.getAlgorithmId()); try { final WorkbenchCorePlugin core = WorkbenchCorePlugin.getDefault(); /* * Limit saved attributes to @Input and @Processing ones. */ final Map<String, Object> actual = search.getAttributeValueSet() .getAttributeValues(); final AttributeValueSet filtered = new AttributeValueSet("memento-saved"); final BindableDescriptor input = core.getComponentDescriptor( search.getSourceId()).flatten().only(Input.class, Processing.class); for (String key : input.attributeDescriptors.keySet()) { if (actual.containsKey(key)) { filtered.setAttributeValue(key, actual.get(key)); } } final BindableDescriptor algorithm = core.getComponentDescriptor( search.getAlgorithmId()).flatten().only(Input.class, Processing.class); for (String key : algorithm.attributeDescriptors.keySet()) { if (actual.containsKey(key)) { filtered.setAttributeValue(key, actual.get(key)); } } final ByteArrayOutputStream os = new ByteArrayOutputStream(); AttributeValueSets sets = new AttributeValueSets(); sets.addAttributeValueSet("default", filtered); sets.serialize(os); os.close(); memento.createChild(ATTRIBUTES_ELEMENT).putTextData( new String(os.toByteArray(), "UTF-8")); } catch (Exception e) { Utils.logError(e, false); } } }