Package org.sylfra.idea.plugins.revu.externalizing.impl

Source Code of org.sylfra.idea.plugins.revu.externalizing.impl.ReviewConverter

package org.sylfra.idea.plugins.revu.externalizing.impl;

import com.intellij.openapi.vfs.VirtualFile;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import org.sylfra.idea.plugins.revu.business.ReviewManager;
import org.sylfra.idea.plugins.revu.model.*;

import java.util.*;

/**
* @author <a href="mailto:syllant@gmail.com">Sylvain FRANCOIS</a>
* @version $Id$
*/
class ReviewConverter extends AbstractConverter
{
  private static final String REVU_SCHEMA_ID = "http://plugins.intellij.net/revu";
  private static final String REVU_SCHEMA_LOCATION = "http://plugins.intellij.net/revu/ns/revu_1_0.xsd";

  public boolean canConvert(Class type)
  {
    return Review.class.equals(type);
  }

  public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context)
  {
    Review review = (Review) source;

    writer.addAttribute("xmlns", REVU_SCHEMA_ID);
    writer.addAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
    writer.addAttribute("xsi:schemaLocation", REVU_SCHEMA_ID + " " + REVU_SCHEMA_LOCATION);

    writer.addAttribute("name", review.getName());
    writer.addAttribute("status", review.getStatus().toString().toLowerCase());
    writer.addAttribute("shared", String.valueOf(review.isShared()));

    if (review.getExtendedReview() != null)
    {
      writer.addAttribute("extends", review.getExtendedReview().getName());
    }

    // History
    writer.startNode("history");
    context.convertAnother(review.getHistory());
    writer.endNode();

    // Desc
    if (review.getGoal() != null)
    {
      writer.startNode("goal");
      writer.setValue(review.getGoal());
      writer.endNode();
    }

    // Referential
    writer.startNode("referential");
    context.convertAnother(review.getDataReferential());
    writer.endNode();

    // FileScope
    writer.startNode("filescope");
    context.convertAnother(review.getFileScope());
    writer.endNode();

    // Issues
    writer.startNode("issues");
    SortedMap<VirtualFile, List<Issue>> issuesByFiles
      = new TreeMap<VirtualFile, List<Issue>>(new VirtualFileComparator());
    issuesByFiles.putAll(review.getIssuesByFiles());
    for (List<Issue> issues : issuesByFiles.values())
    {
      for (Issue issue : issues)
      {
        writer.startNode("issue");
        context.convertAnother(issue);
        writer.endNode();
      }
    }
    writer.endNode();
  }

  public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context)
  {
    Review review = getReview(context);

    String name = reader.getAttribute("name");
    String extendedReviewName = reader.getAttribute("extends");

    review.setName(name);

    if (Boolean.TRUE.equals(context.get(ReviewExternalizerXmlImpl.CONTEXT_KEY_PREPARE_MODE)))
    {
      if (extendedReviewName == null)
      {
        review.setExtendedReview(null);
      }
      else
      {
        review.setExtendedReview(new Review(extendedReviewName));
      }
      return review;
    }
    else
    {
      if (extendedReviewName == null)
      {
        review.setExtendedReview(null);
      }
      else
      {
        ReviewManager reviewManager = getProject(context).getComponent(ReviewManager.class);
        review.setExtendedReview(reviewManager.getReviewByName(extendedReviewName));
      }
    }

    String status = reader.getAttribute("status");
    String shared = reader.getAttribute("shared");

    review.setStatus(ReviewStatus.valueOf(status.toUpperCase()));
    review.setShared("true".equals(shared));

    while (reader.hasMoreChildren())
    {
      reader.moveDown();
      if ("issues".equals(reader.getNodeName()))
      {
        List<Issue> issues = new ArrayList<Issue>();
        while (reader.hasMoreChildren())
        {
          reader.moveDown();
          issues.add((Issue) context.convertAnother(issues, Issue.class));
          reader.moveUp();
        }
        review.setIssues(issues);
      }
      else if ("history".equals(reader.getNodeName()))
      {
        review.setHistory((History) context.convertAnother(review, History.class));
      }
      else if ("goal".equals(reader.getNodeName()))
      {
        review.setGoal(reader.getValue());
      }
      else if ("referential".equals(reader.getNodeName()))
      {
        review.setDataReferential((DataReferential) context.convertAnother(review, DataReferential.class));
      }
      else if ("filescope".equals(reader.getNodeName()))
      {
        review.setFileScope((FileScope) context.convertAnother(review, FileScope.class));
      }
      reader.moveUp();
    }

    return review;
  }

  private class VirtualFileComparator implements Comparator<VirtualFile>
  {
    public int compare(VirtualFile o1, VirtualFile o2)
    {
      return (o1 == null) ? -1 : ((o2 == null) ? -1 : o1.getPath().compareTo(o2.getPath()));
    }
  }
}
TOP

Related Classes of org.sylfra.idea.plugins.revu.externalizing.impl.ReviewConverter

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.