/* * Copyright (c) 2008 Stiftung Deutsches Elektronen-Synchrotron, * Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY. * * THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS" BASIS. * WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND * NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE * IN ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR * CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. * NO USE OF ANY SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. * DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, * OR MODIFICATIONS. * THE FULL LICENSE SPECIFYING FOR THE SOFTWARE THE REDISTRIBUTION, MODIFICATION, * USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE DISTRIBUTION OF THIS * PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY FIND A COPY * AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM */ package org.csstudio.sds.ui.internal.actions; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.util.List; import org.csstudio.sds.internal.persistence.PersistenceUtil; import org.csstudio.sds.model.AbstractWidgetModel; import org.csstudio.sds.model.DisplayModel; import org.eclipse.swt.dnd.ByteArrayTransfer; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.TransferData; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Transfer type implementation for widget models. This implementation uses the * normal persistence mechanisms to convert a list of widget models to their xml * representation. This xml is then converted to a byte array. * * @author Sven Wende * */ public final class WidgetModelTransfer extends ByteArrayTransfer { private static final Logger LOG = LoggerFactory.getLogger(WidgetModelTransfer.class); /** * Type name for this transfer type. */ private static final String TYPENAME = "sds_widgets_list"; //$NON-NLS-1$ /** * Type ID for this transfer type. */ private static final int TYPEID = registerType(TYPENAME); /** * The singleton instance. */ private static WidgetModelTransfer _instance; /** * Private constructor (singleton pattern). * */ private WidgetModelTransfer() { } /** * Returns the singleton instance. * * @return the singleton instance */ public static WidgetModelTransfer getInstance() { if (_instance == null) { _instance = new WidgetModelTransfer(); } return _instance; } /** * {@inheritDoc} */ @SuppressWarnings("unchecked") @Override public void javaToNative(final Object object, final TransferData transferData) { if (!isSupportedType(transferData) || !(checkInput(object))) { DND.error(DND.ERROR_INVALID_DATA); } List<AbstractWidgetModel> widgets = (List<AbstractWidgetModel>) object; // create a temporary display model DisplayModel tmpModel = new DisplayModel(false); for (AbstractWidgetModel widget : widgets) { tmpModel.addWidget(widget); } // convert the temporary display model to a byte array InputStream is = PersistenceUtil.createStream(tmpModel); ByteArrayOutputStream bos = new ByteArrayOutputStream(); OutputStreamWriter writer = new OutputStreamWriter(bos); int nextByte; try { while ((nextByte = is.read()) > -1) { writer.write(nextByte); } } catch (IOException e) { LOG.debug(e.toString()); } try { writer.flush(); } catch (IOException e) { LOG.debug(e.toString()); } byte[] bytes = bos.toByteArray(); // clean up try { is.close(); bos.close(); writer.close(); } catch (IOException e) { LOG.debug(e.toString()); } // store the byte array super.javaToNative(bytes, transferData); } /** * {@inheritDoc} */ @Override public Object nativeToJava(final TransferData transferData) { if (isSupportedType(transferData)) { byte[] bytes = (byte[]) super.nativeToJava(transferData); DisplayModel displayModel = new DisplayModel(false); PersistenceUtil.syncFillModel(displayModel, new ByteArrayInputStream(bytes)); List<AbstractWidgetModel> widgets = displayModel.getWidgets(); return widgets; } return null; } /** * Checks the provided input, which must be a non-empty list that contains * only objects of type {@link AbstractWidgetModel}. * * @param input * the input to check * @return true, if the input object is valid, false otherwise */ private boolean checkInput(final Object input) { boolean result = true; if (input instanceof List) { List list = (List) input; if (list.size() > 0) { for (Object o : list) { if (!(o instanceof AbstractWidgetModel)) { result = false; } } } else { result = false; } } else { result = false; } return result; } /** * {@inheritDoc} */ @Override protected String[] getTypeNames() { return new String[] { TYPENAME }; } /** * {@inheritDoc} */ @Override protected int[] getTypeIds() { return new int[] { TYPEID }; } }