This is an automated email from the ASF dual-hosted git repository. msingh pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/ozone.git
commit cd77475ad8fe240c78912b03bcf9cd9dcb9aa724 Author: Xiaoyu Yao <[email protected]> AuthorDate: Wed Mar 10 08:01:07 2021 -0800 HDDS-4905. Add prefix CLI. (#1995) --- .../src/main/smoketest/basic/ozone-shell-lib.robot | 17 +++++ .../src/main/smoketest/basic/ozone-shell.robot | 3 + .../key/acl/prefix/OMPrefixAddAclRequest.java | 1 - .../apache/hadoop/ozone/shell/OzoneAddress.java | 25 +++++++- .../ozone/shell/prefix/AddAclPrefixHandler.java | 52 +++++++++++++++ .../ozone/shell/prefix/GetAclPrefixHandler.java | 40 ++++++++++++ .../hadoop/ozone/shell/prefix/PrefixCommands.java | 75 ++++++++++++++++++++++ .../hadoop/ozone/shell/prefix/PrefixUri.java | 48 ++++++++++++++ .../ozone/shell/prefix/RemoveAclPrefixHandler.java | 54 ++++++++++++++++ .../ozone/shell/prefix/SetAclPrefixHandler.java | 53 +++++++++++++++ .../hadoop/ozone/shell/prefix/package-info.java | 21 ++++++ .../hadoop/ozone/shell/TestOzoneAddress.java | 11 ++++ 12 files changed, 398 insertions(+), 2 deletions(-) diff --git a/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell-lib.robot b/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell-lib.robot index de8c7d2..8c9d5e5 100644 --- a/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell-lib.robot +++ b/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell-lib.robot @@ -167,3 +167,20 @@ Test key Acls ${result} = Execute ozone sh key getacl ${protocol}${server}/${volume}/bb1/key2 Should Match Regexp ${result} \"type\" : \"USER\",\n.*\"name\" : \"superuser1\",\n.*\"aclScope\" : \"ACCESS\",\n.*\"aclList\" : . \"READ\", \"WRITE\", \"READ_ACL\", \"WRITE_ACL\" Should Match Regexp ${result} \"type\" : \"GROUP\",\n.*\"name\" : \"superuser1\",\n.*\"aclScope\" : \"ACCESS\",\n.*\"aclList\" : . \"ALL\" . + +Test prefix Acls + [arguments] ${protocol} ${server} ${volume} + Execute ozone sh prefix addacl ${protocol}${server}/${volume}/bb1/prefix1/ -a user:superuser1:rwxy[DEFAULT] + ${result} = Execute ozone sh prefix getacl ${protocol}${server}/${volume}/bb1/prefix1/ + Should Match Regexp ${result} \"type\" : \"USER\",\n.*\"name\" : \"superuser1\",\n.*\"aclScope\" : \"DEFAULT\",\n.*\"aclList\" : . \"READ\", \"WRITE\", \"READ_ACL\", \"WRITE_ACL\" + ${result} = Execute ozone sh prefix removeacl ${protocol}${server}/${volume}/bb1/prefix1/ -a user:superuser1:xy + ${result} = Execute ozone sh prefix getacl ${protocol}${server}/${volume}/bb1/prefix1/ + Should Match Regexp ${result} \"type\" : \"USER\",\n.*\"name\" : \"superuser1\",\n.*\"aclScope\" : \"DEFAULT\",\n.*\"aclList\" : . \"READ\", \"WRITE\" + ${result} = Execute ozone sh prefix setacl ${protocol}${server}/${volume}/bb1/prefix1/ -al user:superuser1:rwxy[DEFAULT],group:superuser1:a[DEFAULT],user:testuser/[email protected]:rwxyc + ${result} = Execute ozone sh prefix getacl ${protocol}${server}/${volume}/bb1/prefix1/ + Should Match Regexp ${result} \"type\" : \"USER\",\n.*\"name\" : \"superuser1\",\n.*\"aclScope\" : \"DEFAULT\",\n.*\"aclList\" : . \"READ\", \"WRITE\", \"READ_ACL\", \"WRITE_ACL\" + Should Match Regexp ${result} \"type\" : \"GROUP\",\n.*\"name\" : \"superuser1\",\n.*\"aclScope\" : \"DEFAULT\",\n.*\"aclList\" : . \"ALL\" . + Execute ozone sh key put ${protocol}${server}/${volume}/bb1/prefix1/key1 /opt/hadoop/NOTICE.txt + ${result} = Execute ozone sh key getacl ${protocol}${server}/${volume}/bb1/prefix1/key1 + Should Match Regexp ${result} \"type\" : \"USER\",\n.*\"name\" : \"superuser1\",\n.*\"aclScope\" : \"ACCESS\",\n.*\"aclList\" : . \"READ\", \"WRITE\", \"READ_ACL\", \"WRITE_ACL\" + Should Match Regexp ${result} \"type\" : \"GROUP\",\n.*\"name\" : \"superuser1\",\n.*\"aclScope\" : \"ACCESS\",\n.*\"aclList\" : . \"ALL\" . \ No newline at end of file diff --git a/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell.robot b/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell.robot index fcaa524..d0f319e 100644 --- a/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell.robot +++ b/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell.robot @@ -35,6 +35,9 @@ RpcClient bucket acls RpcClient key acls Test Key Acls o3:// om:9862 ${prefix}-rpcwoport2 +RpcClient prefix acls + Test Prefix Acls o3:// om:9862 ${prefix}-rpcwoport2 + RpcClient without host Test ozone shell o3:// ${EMPTY} ${prefix}-rpcwport diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAddAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAddAclRequest.java index 0c67b70..2f23a3b 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAddAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAddAclRequest.java @@ -112,7 +112,6 @@ public class OMPrefixAddAclRequest extends OMPrefixAclRequest { } break; case FAILURE: - omMetrics.incNumBucketUpdateFails(); LOG.error("Add acl {} to path {} failed!", ozoneAcls, ozoneObj.getPath(), exception); break; diff --git a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/OzoneAddress.java b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/OzoneAddress.java index 0ddd657..740e667 100644 --- a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/OzoneAddress.java +++ b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/OzoneAddress.java @@ -56,6 +56,8 @@ public class OzoneAddress { private String keyName = ""; + private boolean isPrefix = false; + public OzoneAddress() throws OzoneClientException { this("o3:///"); } @@ -295,6 +297,10 @@ public class OzoneAddress { return keyName; } + public boolean isPrefix() { + return isPrefix; + } + public void ensureBucketAddress() throws OzoneClientException { if (keyName.length() > 0) { throw new OzoneClientException( @@ -308,6 +314,22 @@ public class OzoneAddress { } } + // Ensure prefix address with a prefix flag + // Allow CLI to differentiate key and prefix address + public void ensurePrefixAddress() throws OzoneClientException { + if (keyName.length() == 0) { + throw new OzoneClientException( + "prefix name is missing."); + } else if (volumeName.length() == 0) { + throw new OzoneClientException( + "Volume name is missing"); + } else if (bucketName.length() == 0) { + throw new OzoneClientException( + "Bucket name is missing"); + } + isPrefix = true; + } + public void ensureKeyAddress() throws OzoneClientException { if (keyName.length() == 0) { throw new OzoneClientException( @@ -354,7 +376,8 @@ public class OzoneAddress { private OzoneObj.ResourceType getResourceType() { if (!keyName.isEmpty()) { - return OzoneObj.ResourceType.KEY; + return isPrefix ? OzoneObj.ResourceType.PREFIX : + OzoneObj.ResourceType.KEY; } if (!bucketName.isEmpty()) { return OzoneObj.ResourceType.BUCKET; diff --git a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/prefix/AddAclPrefixHandler.java b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/prefix/AddAclPrefixHandler.java new file mode 100644 index 0000000..52489ed --- /dev/null +++ b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/prefix/AddAclPrefixHandler.java @@ -0,0 +1,52 @@ +/* + * 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.apache.hadoop.ozone.shell.prefix; + +import org.apache.hadoop.ozone.client.OzoneClient; +import org.apache.hadoop.ozone.security.acl.OzoneObj; +import org.apache.hadoop.ozone.shell.OzoneAddress; +import org.apache.hadoop.ozone.shell.acl.AclHandler; +import org.apache.hadoop.ozone.shell.acl.AclOption; +import picocli.CommandLine; + +import java.io.IOException; + +/** + * Add ACL to prefix. + */ [email protected](name = AclHandler.ADD_ACL_NAME, + description = AclHandler.ADD_ACL_DESC) +public class AddAclPrefixHandler extends AclHandler { + + @CommandLine.Mixin + private PrefixUri address; + + @CommandLine.Mixin + private AclOption acls; + + @Override + protected OzoneAddress getAddress() { + return address.getValue(); + } + + @Override + protected void execute(OzoneClient client, OzoneObj obj) throws IOException { + acls.addTo(obj, client.getObjectStore(), out()); + } + +} diff --git a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/prefix/GetAclPrefixHandler.java b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/prefix/GetAclPrefixHandler.java new file mode 100644 index 0000000..e244bb6 --- /dev/null +++ b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/prefix/GetAclPrefixHandler.java @@ -0,0 +1,40 @@ +/* + * 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.apache.hadoop.ozone.shell.prefix; + +import org.apache.hadoop.ozone.shell.OzoneAddress; +import org.apache.hadoop.ozone.shell.acl.AclHandler; +import org.apache.hadoop.ozone.shell.acl.GetAclHandler; +import picocli.CommandLine; + +/** + * Get ACL of prefix. + */ [email protected](name = AclHandler.GET_ACL_NAME, + description = AclHandler.GET_ACL_DESC) +public class GetAclPrefixHandler extends GetAclHandler { + + @CommandLine.Mixin + private PrefixUri address; + + @Override + protected OzoneAddress getAddress() { + return address.getValue(); + } + +} diff --git a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/prefix/PrefixCommands.java b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/prefix/PrefixCommands.java new file mode 100644 index 0000000..e2d703b --- /dev/null +++ b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/prefix/PrefixCommands.java @@ -0,0 +1,75 @@ +/* + * 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.apache.hadoop.ozone.shell.prefix; + +import java.util.concurrent.Callable; + +import org.apache.hadoop.hdds.cli.GenericParentCommand; +import org.apache.hadoop.hdds.cli.HddsVersionProvider; +import org.apache.hadoop.hdds.cli.MissingSubcommandException; +import org.apache.hadoop.hdds.cli.SubcommandWithParent; +import org.apache.hadoop.hdds.conf.OzoneConfiguration; +import org.apache.hadoop.ozone.shell.OzoneShell; +import org.apache.hadoop.ozone.shell.Shell; + +import org.kohsuke.MetaInfServices; +import picocli.CommandLine.Command; +import picocli.CommandLine.ParentCommand; + +/** + * Subcommands for the prefix related operations. + */ +@Command(name = "prefix", + description = "Prefix specific operations", + subcommands = { + AddAclPrefixHandler.class, + RemoveAclPrefixHandler.class, + SetAclPrefixHandler.class, + GetAclPrefixHandler.class, + }, + mixinStandardHelpOptions = true, + versionProvider = HddsVersionProvider.class) +@MetaInfServices(SubcommandWithParent.class) +public class PrefixCommands implements GenericParentCommand, Callable<Void>, + SubcommandWithParent { + + @ParentCommand + private Shell shell; + + @Override + public Void call() throws Exception { + throw new MissingSubcommandException( + this.shell.getCmd().getSubcommands().get("prefix")); + } + + @Override + public boolean isVerbose() { + return shell.isVerbose(); + } + + @Override + public OzoneConfiguration createOzoneConfiguration() { + return shell.createOzoneConfiguration(); + } + + @Override + public Class<?> getParentType() { + return OzoneShell.class; + } +} diff --git a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/prefix/PrefixUri.java b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/prefix/PrefixUri.java new file mode 100644 index 0000000..59a8eed --- /dev/null +++ b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/prefix/PrefixUri.java @@ -0,0 +1,48 @@ +/* + * 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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.apache.hadoop.ozone.shell.prefix; + +import org.apache.hadoop.ozone.client.OzoneClientException; +import org.apache.hadoop.ozone.shell.Shell; +import org.apache.hadoop.ozone.shell.OzoneAddress; +import picocli.CommandLine; + +/** + * URI parameter for prefix-specific commands. + */ +public class PrefixUri implements CommandLine.ITypeConverter<OzoneAddress> { + + private static final String OZONE_PREFIX_URI_DESCRIPTION = + "URI of the volume/bucket/prefix.\n" + Shell.OZONE_URI_DESCRIPTION; + + @CommandLine.Parameters(index = "0", arity = "1..1", + description = OZONE_PREFIX_URI_DESCRIPTION, + converter = org.apache.hadoop.ozone.shell.prefix.PrefixUri.class) + private OzoneAddress value; + + public OzoneAddress getValue() { + return value; + } + + @Override + public OzoneAddress convert(String str) throws OzoneClientException { + OzoneAddress address = new OzoneAddress(str); + address.ensurePrefixAddress(); + return address; + } +} diff --git a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/prefix/RemoveAclPrefixHandler.java b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/prefix/RemoveAclPrefixHandler.java new file mode 100644 index 0000000..3ebaae6 --- /dev/null +++ b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/prefix/RemoveAclPrefixHandler.java @@ -0,0 +1,54 @@ +/* + * 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.apache.hadoop.ozone.shell.prefix; + +import org.apache.hadoop.ozone.client.OzoneClient; +import org.apache.hadoop.ozone.security.acl.OzoneObj; +import org.apache.hadoop.ozone.shell.OzoneAddress; +import org.apache.hadoop.ozone.shell.acl.AclHandler; +import org.apache.hadoop.ozone.shell.acl.AclOption; +import picocli.CommandLine; + +import java.io.IOException; + +/** + * Remove ACL from prefix. + */ [email protected](name = AclHandler.REMOVE_ACL_NAME, + description = AclHandler.REMOVE_ACL_DESC) +public class RemoveAclPrefixHandler extends AclHandler { + + @CommandLine.Mixin + private PrefixUri address; + + @CommandLine.Mixin + private AclOption acls; + + @Override + protected OzoneAddress getAddress() { + return address.getValue(); + } + + @Override + protected void execute(OzoneClient client, OzoneObj obj) throws IOException { + acls.removeFrom(obj, client.getObjectStore(), out()); + } + +} diff --git a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/prefix/SetAclPrefixHandler.java b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/prefix/SetAclPrefixHandler.java new file mode 100644 index 0000000..2816b0d --- /dev/null +++ b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/prefix/SetAclPrefixHandler.java @@ -0,0 +1,53 @@ +/* + * 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.apache.hadoop.ozone.shell.prefix; + +import org.apache.hadoop.ozone.client.OzoneClient; +import org.apache.hadoop.ozone.security.acl.OzoneObj; +import org.apache.hadoop.ozone.shell.OzoneAddress; +import org.apache.hadoop.ozone.shell.acl.AclHandler; +import org.apache.hadoop.ozone.shell.acl.AclOption; +import picocli.CommandLine; + +import java.io.IOException; + +/** + * Set ACL on prefix. + */ [email protected](name = AclHandler.SET_ACL_NAME, + description = AclHandler.SET_ACL_DESC) +public class SetAclPrefixHandler extends AclHandler { + + @CommandLine.Mixin + private PrefixUri address; + + @CommandLine.Mixin + private AclOption acls; + + @Override + protected OzoneAddress getAddress() { + return address.getValue(); + } + + @Override + protected void execute(OzoneClient client, OzoneObj obj) + throws IOException { + acls.setOn(obj, client.getObjectStore(), out()); + } + +} diff --git a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/prefix/package-info.java b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/prefix/package-info.java new file mode 100644 index 0000000..09738cc --- /dev/null +++ b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/prefix/package-info.java @@ -0,0 +1,21 @@ +/* + * 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. + */ +/** + * Prefix Acl commands for Ozone. + */ +package org.apache.hadoop.ozone.shell.prefix; diff --git a/hadoop-ozone/tools/src/test/java/org/apache/hadoop/ozone/shell/TestOzoneAddress.java b/hadoop-ozone/tools/src/test/java/org/apache/hadoop/ozone/shell/TestOzoneAddress.java index 10ba576..ec651c6 100644 --- a/hadoop-ozone/tools/src/test/java/org/apache/hadoop/ozone/shell/TestOzoneAddress.java +++ b/hadoop-ozone/tools/src/test/java/org/apache/hadoop/ozone/shell/TestOzoneAddress.java @@ -94,5 +94,16 @@ public class TestOzoneAddress { Assert.assertEquals("vol1", address.getVolumeName()); Assert.assertEquals("bucket", address.getBucketName()); Assert.assertEquals("key1/key3/key", address.getKeyName()); + Assert.assertFalse("this should not be a prefix", + address.isPrefix()); + + address = new OzoneAddress(prefix + "vol1/bucket/prefix"); + address.ensurePrefixAddress(); + Assert.assertEquals("vol1", address.getVolumeName()); + Assert.assertEquals("bucket", address.getBucketName()); + Assert.assertEquals("prefix", address.getKeyName()); + Assert.assertTrue("this should be a prefix", + address.isPrefix()); + } } \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
