docs: @Override
      public WireFeed createRealFeed(final SyndFeed syndFeed) {
  
          final List<SyndEntry> entries = Collections.synchronizedList(syndFeed.getEntries());
  
          final HashMap<String, Outline> entriesByNode = new HashMap<String, Outline>();
  
          // this will hold entries that we can't parent the first time.
          final ArrayList<OutlineHolder> doAfterPass = new ArrayList<OutlineHolder>();
  
          // this holds root level outlines;
          final ArrayList<Outline> root = new ArrayList<Outline>();
  
          for (int i = 0; i < entries.size(); i++) {
              final SyndEntry entry = entries.get(i);
              final Outline o = new Outline();
  
              final List<SyndCategory> cats = Collections.synchronizedList(entry.getCategories());
              boolean parentFound = false;
              final StringBuffer category = new StringBuffer();
  
              for (int j = 0; j < cats.size(); j++) {
                  final SyndCategory cat = cats.get(j);
  
                  if (cat.getTaxonomyUri() != null && cat.getTaxonomyUri().equals(URI_TREE)) {
                      final String nodeVal = cat.getName().substring(cat.getName().lastIndexOf("."), cat.getName().length());
  
                      if (cat.getName().startsWith("node.")) {
                          entriesByNode.put(nodeVal, o);
                      } else if (cat.getName().startsWith("parent.")) {
                          parentFound = true;
  
                          final Outline parent = entriesByNode.get(nodeVal);
  
                          if (parent != null) {
                              parent.getChildren().add(o);
                          } else {
                              doAfterPass.add(new OutlineHolder(o, nodeVal));
                          }
                      }
                  } else if (cat.getTaxonomyUri() != null && cat.getTaxonomyUri().startsWith(URI_ATTRIBUTE)) {
                      final String name = cat.getTaxonomyUri().substring(cat.getTaxonomyUri().indexOf("#") + 1, cat.getTaxonomyUri().length());
                      o.getAttributes().add(new Attribute(name, cat.getName()));
                  } else {
                      if (category.length() > 0) {
                          category.append(", ");
                      }
  
                      category.append(cat.getName());
                  }
              }
  
              if (!parentFound) {
                  root.add(o);
              }
  
              if (category.length() > 0) {
                  o.getAttributes().add(new Attribute("category", category.toString()));
              }
  
              final List<SyndLink> links = Collections.synchronizedList(entry.getLinks());
              // final String entryLink = entry.getLink();
  
              for (int j = 0; j < links.size(); j++) {
                  final SyndLink link = links.get(j);
  
                  // if(link.getHref().equals(entryLink)) {
                  if (link.getType() != null && link.getRel() != null && link.getRel().equals("alternate")
                          && (link.getType().equals("application/rss+xml") || link.getType().equals("application/atom+xml"))) {
                      o.setType("rss");
  
                      if (o.getXmlUrl() == null) {
                          o.getAttributes().add(new Attribute("xmlUrl", link.getHref()));
                      }
                  } else if (link.getType() != null && link.getType().equals("text/html")) {
                      if (o.getHtmlUrl() == null) {
                          o.getAttributes().add(new Attribute("htmlUrl", link.getHref()));
                      }
                  } else {
                      o.setType(link.getType());
                  }
  
                  // }
              }
  
              if (o.getType() == null || o.getType().equals("link")) {
                  o.setText(entry.getTitle());
  
              } else {
                  o.setTitle(entry.getTitle());
              }
  
              if (o.getText() == null && entry.getDescription() != null) {
                  o.setText(entry.getDescription().getValue());
              }
          }
  
          // Do back and parenting for things we missed.
          for (int i = 0; i < doAfterPass.size(); i++) {
              final OutlineHolder o = doAfterPass.get(i);
              final Outline parent = entriesByNode.get(o.parent);
  
              if (parent == null) {
                  root.add(o.outline);
                  LOG.warn("Unable to find parent node: {}", o.parent);
              } else {
                  parent.getChildren().add(o.outline);
              }
          }
  
          final Opml opml = new Opml();
          opml.setFeedType(getType());
          opml.setCreated(syndFeed.getPublishedDate());
          opml.setTitle(syndFeed.getTitle());
  
          final List<SyndPerson> authors = Collections.synchronizedList(syndFeed.getAuthors());
  
          for (int i = 0; i < authors.size(); i++) {
              final SyndPerson p = authors.get(i);
  
              if (syndFeed.getAuthor() == null || syndFeed.getAuthor().equals(p.getName())) {
                  opml.setOwnerName(p.getName());
                  opml.setOwnerEmail(p.getEmail());
                  opml.setOwnerId(p.getUri());
              }
          }
  
          opml.setOutlines(root);
  
          return opml;
      }