Skip to content

Commit

Permalink
Update XMLParser to latest from Shrinkwrap
Browse files Browse the repository at this point in the history
  • Loading branch information
lincolnthree committed Mar 12, 2013
1 parent a6730ce commit bf7d75c
Show file tree
Hide file tree
Showing 20 changed files with 1,398 additions and 1,294 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@

/**
* Used to perform Addon installation/registration operations.
*
*
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
* @author <a href="mailto:koen.aers@gmail.com">Koen Aers</a>
* @author <a href="mailto:ggastald@redhat.com">George Gastaldi</a>
Expand Down Expand Up @@ -90,13 +90,13 @@ public static boolean isApiCompatible(CharSequence runtimeVersion, AddonId entry

/**
* This method only returns true if:
*
*
* - The major version of addonApiVersion is equal to the major version of runtimeVersion AND
*
*
* - The minor version of addonApiVersion is less or equal to the minor version of runtimeVersion
*
*
* - The addonApiVersion is null
*
*
* @param runtimeVersion a version in the format x.x.x
* @param addonApiVersion a version in the format x.x.x
*/
Expand Down Expand Up @@ -135,7 +135,6 @@ private AddonRepositoryImpl(File dir)
this.addonDir = dir;
}

@SuppressWarnings("resource")
@Override
public boolean deploy(AddonId addon, List<AddonDependency> dependencies, List<File> resources)
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/*
* JBoss, Home of Professional Open Source
* Copyright 2011, 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;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;



/**
* Form of {@link GetQuery} for retrieving nodes matching absolute patterns like '/root/node1/node2'. Sequence of
* patterns must much a path from the root, where i-th pattern matches i-th element on the path from the root.
*
* If no matches are found, <code>null</code> is returned.
*
* @author <a href="mailto:alr@jboss.org">Andrew Lee Rubinger</a>
* @author <a href="mailto:bartosz.majsak@gmail.com">Bartosz Majsak</a>
*/
enum AbsoluteGetQuery implements Query<List<Node>> {

INSTANCE;

/**
* {@inheritDoc}
*
* @see org.jboss.shrinkwrap.descriptor.spi.node.Query#execute(org.jboss.forge.parser.xml.org.jboss.forge.parser.xml.shrinkwrap.descriptor.spi.node.Node,
* org.jboss.forge.parser.xml.org.jboss.forge.parser.xml.query.shrinkwrap.descriptor.spi.node.Pattern[])
*/
@Override
public List<Node> execute(final Node node, final Pattern... patterns) throws IllegalArgumentException {
// Precondition checks
QueryUtil.validateNodeAndPatterns(node, patterns);

// Delegate to recursive handler, starting at the top
return findMatch(node, Arrays.asList(patterns));
}

protected List<Node> findMatch(Node start, List<Pattern> patterns) {
// Get the next pattern in sequence
final Pattern pattern = patterns.get(0);

if (!pattern.matches(start)) {
return Collections.emptyList();
}

// Hold the matched Nodes
final List<Node> matchedNodes = new ArrayList<Node>();

if (patterns.size() == 1) {
matchedNodes.add(start);
return matchedNodes;
}

for (final Node child : start.getChildren()) {
// Only use patterns that haven't already matched
final List<Pattern> remainingPatterns = patterns.subList(1, patterns.size());

// Recursion point
matchedNodes.addAll(findMatch(child, remainingPatterns));
}

return matchedNodes;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
* 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;

import java.util.List;



/**
* Form of {@link GetQuery} used as a convenience to retrieve a single result. If more than one match is found,
* {@link IllegalArgumentException} will be thrown. If no matches are found, <code>null</code> is returned.
*
* @author <a href="mailto:aslak@redhat.com">Aslak Knutsen</a>
* @author <a href="mailto:andrew.rubinger@jboss.org">ALR</a>
*/
enum AbsoluteGetSingleQuery implements Query<Node> {

INSTANCE;

/**
* {@inheritDoc}
*
* @see org.jboss.shrinkwrap.descriptor.spi.node.Query#execute(org.jboss.forge.parser.xml.org.jboss.forge.parser.xml.shrinkwrap.descriptor.spi.node.Node,
* org.jboss.forge.parser.xml.org.jboss.forge.parser.xml.query.shrinkwrap.descriptor.spi.node.Pattern[])
*/
@Override
public Node execute(final Node node, final Pattern... patterns) {
// Precondition checks
QueryUtil.validateNodeAndPatterns(node, patterns);

final List<Node> nodes = AbsoluteGetQuery.INSTANCE.execute(node, patterns);

if (nodes == null || nodes.isEmpty()) {
return null;
}
if (nodes.size() > 1) {
throw new IllegalArgumentException("Multiple nodes matching expression found");
}
return nodes.get(0);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*
* 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;

import java.util.Map;



/**
* Creates the specified {@link Pattern}s starting at the specified {@link Node}.
*
* @author <a href="mailto:aslak@redhat.com">Aslak Knutsen</a>
* @author <a href="mailto:andrew.rubinger@jboss.org">ALR</a>
*/
enum CreateQuery implements Query<Node> {

INSTANCE;

/**
* {@inheritDoc}
*
* @see org.jboss.shrinkwrap.descriptor.spi.node.Query#execute(org.jboss.forge.parser.xml.org.jboss.forge.parser.xml.shrinkwrap.descriptor.spi.node.Node,
* org.jboss.forge.parser.xml.org.jboss.forge.parser.xml.query.shrinkwrap.descriptor.spi.node.Pattern[])
*/
@Override
public Node execute(final Node node, final Pattern... patterns) {
// Precondition checks
QueryUtil.validateNodeAndPatterns(node, patterns);

Node returnValue = node;

for (final Pattern pattern : patterns) {
returnValue = new Node(pattern.getName(), returnValue).text(pattern.getText());
for (Map.Entry<String, String> entry : pattern.getAttributes().entrySet()) {
returnValue.attribute(entry.getKey(), entry.getValue());
}
}
return returnValue;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
/*
* 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;

import java.util.Arrays;
import java.util.List;



/**
* Starting at the specified {@link Node}, either returns an existing match for the specified {@link Pattern}s, or
* creates new {@link Node}(s) as appropriate and returns the root of those created.
*
* @author <a href="mailto:aslak@redhat.com">Aslak Knutsen</a>
* @author <a href="mailto:andrew.rubinger@jboss.org">ALR</a>
*/
enum GetOrCreateQuery implements Query<Node> {

INSTANCE;

/**
* Used in casting
*/
private static final Pattern[] PATTERN_CAST = new Pattern[] {};

/**
* {@inheritDoc}
*
* @see org.jboss.shrinkwrap.descriptor.spi.node.Query#execute(org.jboss.forge.parser.xml.org.jboss.forge.parser.xml.shrinkwrap.descriptor.spi.node.Node,
* org.jboss.forge.parser.xml.org.jboss.forge.parser.xml.query.shrinkwrap.descriptor.spi.node.Pattern[])
*/
@Override
public Node execute(final Node node, final Pattern... patterns) {
// Precondition checks
QueryUtil.validateNodeAndPatterns(node, patterns);

// Init
final List<Pattern> patternList = Arrays.asList(patterns);

// Find or create, starting at the top
final Node found = this.findOrCreate(node, patternList, patterns);

// Return
return found;

}

private Node findOrCreate(final Node root, final List<Pattern> patternsToSearch, final Pattern... allPatterns) {

final Node found = AbsoluteGetSingleQuery.INSTANCE.execute(root, patternsToSearch.toArray(PATTERN_CAST));

// Not found; we'll have to make it
if (found == null) {
// First find the Node we start to match
if (patternsToSearch.size() > 1) {
return this.findOrCreate(root, patternsToSearch.subList(0, patternsToSearch.size() - 1), allPatterns);
}

}

// If still not found, nothing at all matched the tree, so go ahead and create the whole thing
if (found == null) {
return CreateQuery.INSTANCE.execute(root, allPatterns);
} else {
// If this is null, there was no match anywhere in the pattern list
// Determine which patterns are left to create
final int offset = patternsToSearch.size();
final int numPatternsToCreate = allPatterns.length - offset;
final Pattern[] patternsToCreate = new Pattern[numPatternsToCreate];

// Only create if there's more to do
if (patternsToCreate.length > 0) {
// Copy the patterns we should be creating only
for (int i = 0; i < numPatternsToCreate; i++) {
patternsToCreate[i] = allPatterns[offset + i];
}

// Create the new Node and return it
return CreateQuery.INSTANCE.execute(found, patternsToCreate);
}
// Otherwise just return the Node we found (like a "get" operation)
else {
return found;
}
}

}

}
Loading

0 comments on commit bf7d75c

Please sign in to comment.