TwissInitialConditionsXmlConverter.java

// @formatter:off
/*******************************************************************************
 * This file is part of JMad. Copyright (c) 2008-2011, CERN. All rights reserved. Licensed under the Apache License,
 * Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy
 * of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in
 * writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
 * OF ANY KIND, either express or implied. See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/
// @formatter:on

package cern.accsoft.steering.jmad.domain.twiss;

import cern.accsoft.steering.jmad.domain.var.enums.MadxTwissVariable;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;

public class TwissInitialConditionsXmlConverter implements Converter {

    /** The name off the attribute value */
    private static final String ATTR_NAME_VALUE = "value";

    /**
     * @param ctx unused
     */
    @Override
    public void marshal(Object object, HierarchicalStreamWriter writer, MarshallingContext ctx) {

        TwissInitialConditionsImpl twiss = (TwissInitialConditionsImpl) object;
        writer.addAttribute("name", twiss.getName());

        writer.startNode("chrom");
        writer.addAttribute(ATTR_NAME_VALUE, String.valueOf(twiss.isCalcChromaticFunctions()));
        writer.endNode();

        writer.startNode("closed-orbit");
        writer.addAttribute(ATTR_NAME_VALUE, String.valueOf(twiss.isClosedOrbit()));
        writer.endNode();

        writer.startNode("centre");
        writer.addAttribute(ATTR_NAME_VALUE, String.valueOf(twiss.isCalcAtCenter()));
        writer.endNode();

        if (twiss.getPtcPhaseSpaceDimension() != null) {
            writer.startNode("ptc-icase");
            writer.addAttribute(ATTR_NAME_VALUE, String.valueOf(twiss.getPtcPhaseSpaceDimension()));
            writer.endNode();
        }

        if (twiss.getPtcMapOrder() != null) {
            writer.startNode("ptc-no");
            writer.addAttribute(ATTR_NAME_VALUE, String.valueOf(twiss.getPtcMapOrder()));
            writer.endNode();
        }

        if (twiss.getPtcBetz() != null) {
            writer.startNode("ptc-betz");
            writer.addAttribute(ATTR_NAME_VALUE, String.valueOf(twiss.getPtcBetz()));
            writer.endNode();
        }

        if (twiss.getSaveBetaName() != null) {
            writer.startNode("beta0");
            writer.addAttribute(ATTR_NAME_VALUE, twiss.getSaveBetaName());
            writer.endNode();
        }

        for (MadxTwissVariable variable : twiss.getMadxVariables()) {
            Double value = twiss.getValue(variable);
            if (value != null) {
                writer.startNode(variable.getMadxName().toLowerCase());
                writer.addAttribute(ATTR_NAME_VALUE, value.toString());
                writer.endNode();
            }
        }

    }

    /**
     * @param ctx unused
     */
    @Override
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext ctx) {

        String name = reader.getAttribute("name");
        TwissInitialConditionsImpl retVal = new TwissInitialConditionsImpl(name);

        while (reader.hasMoreChildren()) {
            reader.moveDown();
            String nodeName = reader.getNodeName();
            if ("chrom".equals(nodeName)) {
                retVal.setCalcChromaticFunctions(Boolean.parseBoolean(reader.getAttribute(ATTR_NAME_VALUE)));
            } else if ("closed-orbit".equals(nodeName)) {
                retVal.setClosedOrbit(Boolean.parseBoolean(reader.getAttribute(ATTR_NAME_VALUE)));
            } else if ("centre".equals(nodeName)) {
                retVal.setCalcAtCenter(Boolean.parseBoolean(reader.getAttribute(ATTR_NAME_VALUE)));
            } else if ("ptc-icase".equals(nodeName)) {
                retVal.setPtcPhaseSpaceDimension(Integer.parseInt(reader.getAttribute(ATTR_NAME_VALUE)));
            } else if ("ptc-no".equals(nodeName)) {
                retVal.setPtcMapOrder(Integer.parseInt(reader.getAttribute(ATTR_NAME_VALUE)));
            } else if ("ptc-betz".equals(nodeName)) {
                retVal.setPtcBetz(Double.parseDouble(reader.getAttribute(ATTR_NAME_VALUE)));
            } else if ("beta0".equals(nodeName)) {
                retVal.setSaveBetaName(reader.getAttribute(ATTR_NAME_VALUE));
            } else {
                MadxTwissVariable twissVariable = MadxTwissVariable.fromMadxName(nodeName);
                if (retVal.getMadxVariables().contains(twissVariable)) {
                    retVal.setValue(twissVariable, Double.valueOf(reader.getAttribute(ATTR_NAME_VALUE)));
                }
            }
            reader.moveUp();
        }
        return retVal;
    }

    @Override
    public boolean canConvert(Class clazz) {
        return clazz.equals(TwissInitialConditionsImpl.class);
    }
}