-
Notifications
You must be signed in to change notification settings - Fork 162
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Update XMLParser to latest from Shrinkwrap
- Loading branch information
1 parent
a6730ce
commit bf7d75c
Showing
20 changed files
with
1,398 additions
and
1,294 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
81 changes: 81 additions & 0 deletions
81
parser-xml/src/main/java/org/jboss/forge/parser/xml/AbsoluteGetQuery.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
|
||
} |
56 changes: 56 additions & 0 deletions
56
parser-xml/src/main/java/org/jboss/forge/parser/xml/AbsoluteGetSingleQuery.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
|
||
} |
54 changes: 54 additions & 0 deletions
54
parser-xml/src/main/java/org/jboss/forge/parser/xml/CreateQuery.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
} |
103 changes: 103 additions & 0 deletions
103
parser-xml/src/main/java/org/jboss/forge/parser/xml/GetOrCreateQuery.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
} | ||
|
||
} | ||
|
||
} |
Oops, something went wrong.