Java:Maneira comum de validar e converter “host:port” em InetSocketAddress?
-
23-09-2019 - |
Pergunta
Qual é a maneira comum em Java de validar e converter uma string no formato host:port
em uma instância de InetSocketAddress
?
Seria bom se os seguintes critérios fossem atendidos:
Nenhuma pesquisa de endereço;
Trabalhando para nomes de host IPv4, IPv6 e "string";
(Para IPv4 éip:port
, para IPv6 é[ip]:port
, certo?Existe alguma RFC que defina todos esses esquemas?)De preferência sem analisar a string manualmente.
(Estou pensando em todos aqueles casos especiais, quando alguém pensa que conhece todas as formas válidas de endereços de soquete, mas se esquece "daquele caso especial" que leva a resultados inesperados.)
Solução
Você pode verificar spworkflow.created das instâncias de fluxo de trabalho
Aqui estão as etapas para o script:
- .
-
Loop através de todos os itens e obter os fluxos de trabalho em execução
$workflows = $item.Workflows
-
Para cada instância de trabalho Verifique a data de criação e compare-a com o dateyTime da última versão do fluxo de trabalho (da sua captura de tela)
$workflow.Created
Dessa forma, você deve ser capaz de detectar os itens que têm versões de fluxo de trabalho antigas em execução
Outras dicas
No site do site e do site no SharePoint 2013, você pode importar / exportar a configuração de pesquisa.Se você estiver se movendo da fazenda para explorar as fontes de conteúdo configuradas na pesquisa SA precisa ser pelo menos semelhante (se não for o mesmo) para que suas propriedades rastejadas estejam disponíveis para mapeamento.Você pode usar o PowerShell para exportar as propriedades rastreadas e as propriedades gerenciadas da SSA.(Não há opção de exportação na SSA).
Olhe para a classe de pesquisaConfigurationportability.
Ele não responde exatamente à pergunta, mas essa resposta ainda pode ser útil para outras pessoas como eu, que desejam apenas analisar um host e uma porta, mas não necessariamente um completo InetAddress
.A goiaba tem HostAndPort aula com um parseString
método.
Outra pessoa deu uma resposta regex, que é o que eu estava fazendo para fazer ao fazer originalmente a pergunta sobre os anfitriões. Ainda farei porque é um exemplo de regex que é um pouco mais avançado e pode ajudar a determinar com que tipo de endereço você está lidando.
String ipPattern = "(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}):(\\d+)";
String ipV6Pattern = "\\[([a-zA-Z0-9:]+)\\]:(\\d+)";
String hostPattern = "([\\w\\.\\-]+):(\\d+)"; // note will allow _ in host name
Pattern p = Pattern.compile( ipPattern + "|" + ipV6Pattern + "|" + hostPattern );
Matcher m = p.matcher( someString );
if( m.matches() ) {
if( m.group(1) != null ) {
// group(1) IP address, group(2) is port
} else if( m.group(3) != null ) {
// group(3) is IPv6 address, group(4) is port
} else if( m.group(5) != null ) {
// group(5) is hostname, group(6) is port
} else {
// Not a valid address
}
}
Modificar para que a porta seja opcional seja bastante direta. Enrole o ": ( d+)" como "(? :: ( d+))?" e depois verifique se há NULL para o grupo (2), etc.
EDIT: Vou observar que não existe uma maneira "comum" da maneira que eu conheço, mas o que foi acima é como eu faria isso se precisasse.
Observação também: o caso IPv4 pode ser removido se os casos do host e IPv4 forem realmente tratados. Eu os dividi porque, às vezes, você pode evitar uma pesquisa de host final se souber que tem o endereço IP.
new InetSocketAddress(
addressString.substring(0, addressString.lastIndexOf(":")),
Integer.parseInt(addressString.substring(addressString.lastIndexOf(":")+1, addressString.length));
? Eu provavelmente cometi um pouco de erro bobo. E suponho que você só queria um novo objeto INetSocketAddress fora da string apenas nesse formato. Host: Port
Todo o tipo de hacker peculiar e soluções elegantes, mas inseguras, fornecidas em outros lugares. Às vezes, a solução de força bruta deselegante é o caminho.
public static InetSocketAddress parseInetSocketAddress(String addressAndPort) throws IllegalArgumentException {
int portPosition = addressAndPort.length();
int portNumber = 0;
while (portPosition > 1 && Character.isDigit(addressAndPort.charAt(portPosition-1)))
{
--portPosition;
}
String address;
if (portPosition > 1 && addressAndPort.charAt(portPosition-1) == ':')
{
try {
portNumber = Integer.parseInt(addressAndPort.substring(portPosition));
} catch (NumberFormatException ignored)
{
throw new IllegalArgumentException("Invalid port number.");
}
address = addressAndPort.substring(0,portPosition-1);
} else {
portNumber = 0;
address = addressAndPort;
}
return new InetSocketAddress(address,portNumber);
}
o Biblioteca Java de Ipaddress de código aberto tem um Nome de anfitrião classe que fará a análise necessária. Isenção de responsabilidade: Eu sou o gerente de projeto da Biblioteca do iPaddress.
Ele analisará nomes de host IPv4, IPv6 e string com ou sem portas. Ele lidará com todos os vários formatos de hosts e endereços. BTW, não existe uma única RFC para isso, há vários RFCs que se aplicam de maneiras diferentes.
String hostName = "[a:b:c:d:e:f:a:b]:8080";
String hostName2 = "1.2.3.4:8080";
String hostName3 = "a.com:8080";
try {
HostName host = new HostName(hostName);
host.validate();
InetSocketAddress address = host.asInetSocketAddress();
HostName host2 = new HostName(hostName2);
host2.validate();
InetSocketAddress address2 = host2.asInetSocketAddress();
HostName host3 = new HostName(hostName3);
host3.validate();
InetSocketAddress address3 = host3.asInetSocketAddress();
// use socket address
} catch (HostNameException e) {
String msg = e.getMessage();
// handle improperly formatted host name or address string
}