diff --git a/src/java/net/brutex/xservices/types/StringMatchDetails.java b/src/java/net/brutex/xservices/types/StringMatchDetails.java new file mode 100644 index 0000000..8b407f2 --- /dev/null +++ b/src/java/net/brutex/xservices/types/StringMatchDetails.java @@ -0,0 +1,32 @@ +/* + * Copyright 2012 Brian Rosenberger (Brutex Network) + * + * 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 net.brutex.xservices.types; + +public class StringMatchDetails { + public long startPosition; + public long endPosition; + public String content; + + public StringMatchDetails() { + } + + public StringMatchDetails(long start, long end, String content) { + this.startPosition = start; + this.endPosition = end; + this.content = content; + } +} \ No newline at end of file diff --git a/src/java/net/brutex/xservices/types/StringMatchType.java b/src/java/net/brutex/xservices/types/StringMatchType.java new file mode 100644 index 0000000..5fdf31a --- /dev/null +++ b/src/java/net/brutex/xservices/types/StringMatchType.java @@ -0,0 +1,50 @@ +/* + * Copyright 2012 Brian Rosenberger (Brutex Network) + * + * 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 net.brutex.xservices.types; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlType; + +import com.sun.xml.txw2.annotation.XmlElement; + + + +/** + * + * @author Brian Rosenberger, bru@brutex.de + */ +@XmlType +public class StringMatchType { + public final List stringlist = new ArrayList(); + public int size=0; + + public StringMatchType() {} + + + public synchronized void addStringMatch(StringMatchDetails match) { + this.stringlist.add(match); + this.size++; + } + + public synchronized void addStringMatch(long start, long end, String content) { + StringMatchDetails details = new StringMatchDetails(start, end, content); + this.addStringMatch( details ); + } +} diff --git a/src/java/net/brutex/xservices/ws/StringService.java b/src/java/net/brutex/xservices/ws/StringService.java index c2ae865..de1e28b 100644 --- a/src/java/net/brutex/xservices/ws/StringService.java +++ b/src/java/net/brutex/xservices/ws/StringService.java @@ -21,6 +21,7 @@ import javax.jws.WebParam; import javax.jws.WebService; import net.brutex.xservices.types.ReturnCode; +import net.brutex.xservices.types.StringMatchType; import net.brutex.xservices.types.StringReplaceType; import net.brutex.xservices.types.TargetNodeType; import net.brutex.xservices.types.ant.AttachmentType; @@ -42,6 +43,7 @@ public interface StringService { public static final String SERVICE_NAME = "StringService"; final String OPERATION_REPLACEREGEX = "replaceRegEx"; + final String OPERATION_MATCHREGEX = "matchRegEx"; final static String PARAM_STRING = "string"; @@ -67,5 +69,12 @@ public interface StringService { @WebParam(name = PARAM_REPLACE) String replace, @WebParam(name = PARAM_FLAGS) String flags) throws XServicesFault; + @WebMethod(operationName=OPERATION_MATCHREGEX) + @WSDLDocumentation(value="Match text based data") + public abstract StringMatchType matchRegEx( + @WebParam(name = PARAM_STRING) String res, + @WebParam(name = PARAM_SEARCH) String search, + @WebParam(name = PARAM_FLAGS) String flags) throws XServicesFault; + } diff --git a/src/java/net/brutex/xservices/ws/impl/StringServiceImpl.java b/src/java/net/brutex/xservices/ws/impl/StringServiceImpl.java index 1abf394..5da580a 100644 --- a/src/java/net/brutex/xservices/ws/impl/StringServiceImpl.java +++ b/src/java/net/brutex/xservices/ws/impl/StringServiceImpl.java @@ -20,6 +20,7 @@ import java.util.regex.Pattern; import javax.jws.WebService; +import net.brutex.xservices.types.StringMatchType; import net.brutex.xservices.types.StringReplaceType; import net.brutex.xservices.util.BrutexNamespaces; import net.brutex.xservices.ws.StringService; @@ -36,10 +37,7 @@ public class StringServiceImpl implements StringService { public StringReplaceType replaceRegEx(String res, String search, String replace, String flags) throws XServicesFault { try { - int allflags = 0; - if (flags.contains("i")) { - allflags = allflags + Pattern.CASE_INSENSITIVE; - } + int allflags = getFlags(flags); Pattern pattern = Pattern.compile(search, allflags); Matcher matcher = pattern.matcher(res); int count = 0; @@ -60,4 +58,40 @@ public class StringServiceImpl implements StringService { } + @Override + public StringMatchType matchRegEx(String res, String search, String flags) + throws XServicesFault { + int allflags = getFlags(flags); + Pattern pattern = Pattern.compile(search, allflags); + Matcher matcher = pattern.matcher(res); + StringMatchType rm = new StringMatchType(); + while (matcher.find()) { + rm.addStringMatch(matcher.start(), matcher.end(), matcher.group()); + } + return rm; + } + + private int getFlags(String flags) { + int allflags = 0; + if(flags.contains("i")) { + allflags = allflags + Pattern.CASE_INSENSITIVE; + } + if(flags.contains("m")) { + allflags = allflags + Pattern.MULTILINE; + } + if(flags.contains("u")) { + allflags = allflags + Pattern.UNICODE_CASE; + } + if(flags.contains("s")) { + allflags = allflags + Pattern.DOTALL; + } + if(flags.contains("d")) { + allflags = allflags + Pattern.UNIX_LINES; + } + if(flags.contains("x")) { + allflags = allflags + Pattern.COMMENTS; + } + return allflags; + } + }