<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">/*
 * This program is free software; you can redistribute it and/or modify it under the 
 * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software 
 * Foundation.
 *
 * You should have received a copy of the GNU Lesser General Public License along with this 
 * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html 
 * or from the Free Software Foundation, Inc., 
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 *
 * Copyright 2008 - 2009 Pentaho Corporation.  All rights reserved.
*/
package org.pentaho.pac.client.scheduler.model;

import com.google.gwt.xml.client.Document;
import com.google.gwt.xml.client.Element;
import com.google.gwt.xml.client.Node;
import com.google.gwt.xml.client.NodeList;

public class SolutionRepositoryModel {

  Document solutionRepositoryDocument = null;
  
  public SolutionRepositoryModel( Document solutionRepositoryDocument ) {
    this.solutionRepositoryDocument = solutionRepositoryDocument;
    buildModel();
  }
  
  public Document getSolutionRepositoryDocument() {
    return solutionRepositoryDocument;
  }
 
  public Document getDocument() {
    return solutionRepositoryDocument;
  }
  
  private void buildModel() {
    
  }
  
  private static String SOLUTION_REPOSITORY_PATH_SEPARATOR = "/"; //$NON-NLS-1$
  
  /**
   * NOTE: path must never have a leading "/". The paths returned from the PCI
   * will NOT have a leading slash.
   * NOTE: this method is necessary because we don't have any xpath code
   * to find the node of interest in the document.
   * 
   * @param path
   * @return
   */
  public String getFriendlyNameFromName( String path ) {
    
    Element el = solutionRepositoryDocument.getDocumentElement();
    return getFriendlyNameFromName( SOLUTION_REPOSITORY_PATH_SEPARATOR + path, el );
  }
  
  /**
   * NOTE: path must ALWAYS have a leading "/"
   * @param path
   * @param node
   * @return
   */
  private String getFriendlyNameFromName( String path, Node node ) {
    path = path.replaceAll("//", "/"); 
    int endIdx = path.indexOf( SOLUTION_REPOSITORY_PATH_SEPARATOR, 1 );
    if ( -1 != endIdx ) {
      String leftPathSegment = path.substring( 1, endIdx );
      String remainingPathSegment = path.substring( endIdx );
      Node nodeWithNameAttribute = findChildNodeWithNameAttributeValue( leftPathSegment, node );
      String friendlySegmentName = getFriendlyNameFromNode( nodeWithNameAttribute );
      return friendlySegmentName + SOLUTION_REPOSITORY_PATH_SEPARATOR + getFriendlyNameFromName( remainingPathSegment, nodeWithNameAttribute );
    } else {
      String leftPathSegment = path.substring( 1 );
      Node nodeWithNameAttribute = findChildNodeWithNameAttributeValue( leftPathSegment, node );
      String friendlySegmentName = getFriendlyNameFromNode( nodeWithNameAttribute );
      return friendlySegmentName;
    }
  }
  
  // TODO sbarkdull, can return null, callers need to check for it
  private String getFriendlyNameFromNode( Node nd ) {
    Node friendlyAttrNd = nd.getAttributes().getNamedItem( "localized-name" ); //$NON-NLS-1$
    return friendlyAttrNd.getNodeValue();
  }
  
  private Node findChildNodeWithNameAttributeValue( String nameAttributeValue, Node node ) {
    NodeList nds = node.getChildNodes();
    for ( int ii=0; ii&lt;nds.getLength(); ++ii ) {
      Node nd = nds.item( ii );
      Node attrNd = nd.getAttributes().getNamedItem( "name" ); //$NON-NLS-1$
      if ( (null != attrNd ) &amp;&amp; attrNd.getNodeValue().equals( nameAttributeValue ) ) {
        return nd;
      }
    }
    return null;  // should never happen
  }
  
//  public String getNameFromFriendlyName( String friendlyName ) {
//    String[] nameParts = friendlyName.split( SOLUTION_REPOSITORY_PATH_SEPARATOR );
//    return "simpson";
//    
//  }
}
</pre></body></html>