/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.cyclop.common;
import static java.util.Comparator.comparingInt;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Optional;
import java.util.Set;
import java.util.TreeSet;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** @author Maciej Miklas */
public class StringHelper {
private final static Logger LOG = LoggerFactory.getLogger(StringHelper.class);
public static String decorate(String toDecorate, StringDecorator decorator, String... keywordsLc) {
String prefix = decorator.prefix();
String postfix = decorator.postfix();
int prefixLength = prefix.length();
StringBuilder buf = new StringBuilder(toDecorate);
for (String keyword : sortBySize(keywordsLc)) {
if (prefix.contains(keyword) || postfix.contains(keyword)) {
LOG.debug("Skipping keyword: {} because it's part of decoreator syntax", keyword);
continue;
}
String bufLc = buf.toString().toLowerCase();
int startSearch = 0;
int foundIdx = -1;
while ((foundIdx = bufLc.indexOf(keyword, startSearch)) >= 0) {
if (foundIdx > prefixLength) {
String kwWithPref = bufLc.substring(foundIdx - prefixLength, foundIdx);
if (prefix.equals(kwWithPref)) {
startSearch = foundIdx + kwWithPref.length() + keyword.length() + 1;
// word already replaced with longer one (better match)
continue;
}
}
int kwStart = foundIdx;
int kwEnd = foundIdx + keyword.length();
String orgKw = buf.substring(kwStart, kwEnd);
String decoratedKw = decorator.decorate(orgKw);
buf.replace(kwStart, kwEnd, decoratedKw);
bufLc = buf.toString().toLowerCase();
startSearch = foundIdx + decoratedKw.length() + 1;
}
}
LOG.trace("Decorated {} to {}", toDecorate, buf);
return buf.toString();
}
private static Set<String> sortBySize(String... strArray) {
Comparator<String> stringComp = String::compareTo;
Set<String> sorted = new TreeSet<>(comparingInt(String::length).reversed().thenComparing(stringComp));
sorted.addAll(Arrays.asList(strArray));
return sorted;
}
public static Optional<InetAddress> toInetAddress(String ip) {
ip = StringUtils.trimToNull(ip);
if (ip == null) {
return Optional.empty();
}
InetAddress addr = null;
try {
addr = InetAddress.getByName(ip);
}
catch (UnknownHostException | SecurityException e) {
LOG.warn("Cannot convert: " + ip + " to valid IP: " + e.getMessage());
LOG.debug(e.getMessage(), e);
}
return Optional.ofNullable(addr);
}
public static interface StringDecorator {
String decorate(String in);
String prefix();
String postfix();
}
}