Package org.jboss.forge.parser.xml.util

Source Code of org.jboss.forge.parser.xml.util.Patterns

/*
* JBoss, Home of Professional Open Source
* Copyright 2010, Red Hat Middleware LLC, and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* 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.
*/
package org.jboss.forge.parser.xml.util;

import java.util.ArrayList;
import java.util.Collection;

import org.jboss.forge.parser.xml.query.Pattern;

/**
* Helper class for creating queries (collections of {@link Pattern}s) from String query expressions
*
* @author <a href="mailto:aslak@redhat.com">Aslak Knutsen</a>
* @version $Revision: $
*/
public class Patterns
{
   private static final String PATH_SEPARATOR = "/";

   private static final String ATTR_PATH_SEPERATOR = "@";

   private static final String ATTR_SEPERATOR = "&";

   private static final String ATTR_VALUE_SEPERATOR = "=";

   private static final Pattern[] ARRAY_CAST = new Pattern[]
   {};

   /**
    * Creates a query collection of {@link Pattern}s from the specified {@link String}-formed query expression
    *
    * @param queryExpression
    * @return
    * @throws IllegalArgumentException If the queryExpression is not specified
    */
   public static Pattern[] from(final String queryExpression) throws IllegalArgumentException
   {
      if (queryExpression == null)
      {
         throw new IllegalArgumentException("query expression must be specified");
      }

      boolean isAbsolute = queryExpression.startsWith(PATH_SEPARATOR);
      final Collection<Pattern> patterns = new ArrayList<Pattern>();

      final String[] paths = (isAbsolute ? queryExpression.substring(1) : queryExpression).split(PATH_SEPARATOR);
      for (final String path : paths)
      {
         String nameSegment = path.indexOf(ATTR_PATH_SEPERATOR) != -1 ? path.substring(0,
                  path.indexOf(ATTR_PATH_SEPERATOR)) : path;

         String name = nameSegment.indexOf(ATTR_VALUE_SEPERATOR) != -1 ? nameSegment.substring(0,
                  nameSegment.indexOf(ATTR_VALUE_SEPERATOR)) : nameSegment;
         String text = nameSegment.indexOf(ATTR_VALUE_SEPERATOR) != -1 ? nameSegment.substring(nameSegment
                  .indexOf(ATTR_VALUE_SEPERATOR) + 1) : null;
         String attribute = path.indexOf(ATTR_PATH_SEPERATOR) != -1 ? path.substring(path.indexOf(ATTR_PATH_SEPERATOR)
                  + ATTR_PATH_SEPERATOR.length(), path.length()) : null;
         String[] attributes = attribute == null ? new String[0] : attribute.split(ATTR_SEPERATOR);

         Pattern pattern = new Pattern(name);
         pattern.text(text);
         for (String attr : attributes)
         {
            String[] nameValue = attr.split(ATTR_VALUE_SEPERATOR);
            if (nameValue.length != 2)
            {
               throw new IllegalArgumentException("Attribute without name or value found: " + attr + " in expression: "
                        + queryExpression);
            }
            pattern.attribute(nameValue[0], nameValue[1]);
         }
         patterns.add(pattern);
      }
      return patterns.toArray(ARRAY_CAST);
   }
}
TOP

Related Classes of org.jboss.forge.parser.xml.util.Patterns

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.