Package eu.planets_project.tb.impl.serialization

Source Code of eu.planets_project.tb.impl.serialization.ExperimentRecord

/*******************************************************************************
* Copyright (c) 2007, 2010 The Planets Project Partners.
*
* All rights reserved. This program and the accompanying
* materials are made available under the terms of the
* Apache License, Version 2.0 which accompanies
* this distribution, and is available at
* http://www.apache.org/licenses/LICENSE-2.0
*
*******************************************************************************/
package eu.planets_project.tb.impl.serialization;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import eu.planets_project.tb.api.model.Comment;
import eu.planets_project.tb.api.persistency.CommentPersistencyRemote;
import eu.planets_project.tb.api.persistency.ExperimentPersistencyRemote;
import eu.planets_project.tb.impl.model.CommentImpl;
import eu.planets_project.tb.impl.model.ExperimentImpl;
import eu.planets_project.tb.impl.persistency.CommentPersistencyImpl;
import eu.planets_project.tb.impl.persistency.ExperimentPersistencyImpl;

/**
*
* @author AnJackson
*
*/
@XmlRootElement(name = "ExperimentRecord", namespace = "http://www.planets-project.eu/testbed/experiment")
@XmlAccessorType(XmlAccessType.FIELD)
public class ExperimentRecord {
    private static Log log = LogFactory.getLog(ExperimentRecord.class);

    /* The Experiment */
    ExperimentImpl experiment;
   
    /* The Comments associated with the Experiment */
    @XmlElement(name="comment", type=CommentImpl.class)
    List<CommentImpl> comments;
   

    /* The hooks to the DB back-end */
    @XmlTransient
    private static ExperimentPersistencyRemote edao = ExperimentPersistencyImpl.getInstance();
    @XmlTransient
    private static CommentPersistencyRemote cmp = CommentPersistencyImpl.getInstance();

    /**
     * Constructor used by JAXB when importing.
     */
    protected ExperimentRecord() {
    }
   
    /**
     * Constructor used when exporting:
     *
     * IMPORTANT The Comments use the DB ID key to locate the parent comment.
     * The ID should be changed when you import the comments.
     * i.e. we use different fields in the persisted version, and patch up on import.
     * Similarly, the experiment ID must be added to each comment when re-loading.
     *
     */
    public ExperimentRecord( long id ) {
        // Load the experiment:
        experiment = (ExperimentImpl) edao.findExperiment(id);
        // Now add the comments:
        List<Comment> coms = cmp.getAllComments(experiment.getEntityID());
        comments = new ArrayList<CommentImpl>();
        for( Comment c : coms ) {
            log.info("Adding comment: "+c.getTitle()+" by "+c.getAuthorID());
            comments.add( (CommentImpl) c );
        }
        // When creating an experiment record for export, we must ensure the comment IDs are stored okay.
        // The parentID's refer to these, and these must be re-written on import.
        for( CommentImpl c : comments ) {
            c.setXmlCommentID( c.getCommentID() );
        }
        // TODO Optionally add files? Or perhaps they should be stored at the ExperimentRecords level?
        // NOTE that this is not required for basic migration between DBs, as the data refs will remain valid.
    }

    /**
     * Factory that does everything required when exporting an experiment as an Experiment Record
     *
     * @param experimentId
     * @return
     */
    static public ExperimentRecord exportExperimentRecord( long experimentId ) {
        return new ExperimentRecord(experimentId);
    }

    /**
     * Factory that does everything required when importing an experiment from an ExperimentRecord.
     *
     * FIXME Test this comment loader!
     *
     * @param er
     * @return
     */
    static public long importExperimentRecord( ExperimentRecord er ) {
        // Persist the experiment:
        long eid = edao.persistExperiment(er.experiment);
        // Also remember the comments, to make it easier to patch up the lists:
        HashMap<Long,Comment> cmts = new HashMap<Long,Comment>();
       
        // Persist the comments, using the correct experiment ID:
        for( CommentImpl c : er.comments ) {
          // Update the comments to the new experiment id:
            c.setExperimentID(eid);
            // Persist the comments:
            long cid = cmp.persistComment(c);
            // Retrieve it again, for cross-reference resolution:
            cmts.put(new Long(c.getXmlCommentID()), cmp.findComment(cid));
        }       
       
        // Go through the comments and correct the parent IDs:
        for( Comment c1 : cmts.values() ) {
          // For this old identifier, look for it's parent comment:
          Comment c2 = cmts.get(c1.getParentID());
          if( c2 != null ) {
              // Update the parent ID to the new comment ID:
              c1.setParentID( c2.getCommentID() );
              // Don't forget to persist the id changes to the DB:
              cmp.updateComment(c1);
          }
        }
       
        // return the experiment id:
        return eid;
    }
}
TOP

Related Classes of eu.planets_project.tb.impl.serialization.ExperimentRecord

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.