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.)

Foi útil?

Solução

Você pode verificar spworkflow.created das instâncias de fluxo de trabalho

Aqui estão as etapas para o script:

    .
  1. Loop através de todos os itens e obter os fluxos de trabalho em execução

    $workflows = $item.Workflows
    

  2. 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.

Importar e exportar configuração de pesquisa

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
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top