diff --git a/docs/admin-tool.md b/docs/admin-tool.md index 131eae088..466b3eaa1 100644 --- a/docs/admin-tool.md +++ b/docs/admin-tool.md @@ -76,7 +76,7 @@ server-side command otherwise. ## Common tool patterns All tools ultimately implement the `Command` interface located in the `tools` -package. If you use an integrated development environment (IDE) such as Eclipse +package. If you use an integrated development environment (IDE) such as IntelliJ to view the type hierarchy of that interface, you'll see all of the commands that exist, as well as how a lot of them are grouped using sub-interfaces or abstract classes that provide additional functionality. The most common patterns diff --git a/java/google/registry/eclipse/BUILD b/java/google/registry/eclipse/BUILD deleted file mode 100644 index d5d8c0c5d..000000000 --- a/java/google/registry/eclipse/BUILD +++ /dev/null @@ -1,71 +0,0 @@ -package( - default_visibility = ["//java/google/registry:registry_project"], -) - -licenses(["notice"]) # Apache 2.0 - -java_binary( - name = "annotation_processors_ide", - create_executable = False, - runtime_deps = [ - "@com_google_auto_common", - "@com_google_auto_factory//:processor", - "@com_google_auto_service//:processor", - "@com_google_auto_value//:processor", - "@com_google_dagger_compiler", - "@com_squareup_javawriter", - ], -) - -java_binary( - name = "registry_deps", - testonly = 1, - create_executable = 0, - runtime_deps = [ - "//java/google/registry/module/backend", - "//java/google/registry/module/frontend", - "//java/google/registry/module/tools", - "//java/google/registry/tools", - "@com_google_apis_google_api_services_cloudkms", - "@com_google_appengine_api_1_0_sdk//:link", - "@com_google_appengine_api_stubs", - "@com_google_appengine_remote_api//:link", - "@com_google_appengine_testing", - "@com_google_appengine_tools_sdk", - "@com_google_guava_testlib", - "@com_google_truth", - "@com_google_truth_extensions_truth_java8_extension", - "@junit", - "@org_apache_ftpserver_core", - "@org_apache_sshd_core", - "@org_hamcrest_library", - "@org_mockito_all", - "@org_mortbay_jetty", - ], -) - -# This rule creates a copy of the registry_deps_deploy.jar with all of the -# domain-registry code removed. This is to avoid having duplicate instances -# of domain-registry classes on the eclipse build path. -genrule( - name = "eclipse_deps", - srcs = ["//java/google/registry/eclipse:registry_deps_deploy.jar"], - outs = ["eclipse_deps.jar"], - cmd = " && ".join([ - "JAR=$$(pwd)/$(location @local_jdk//:bin/jar)", - "IN=$$(pwd)/$(SRCS)", - "OUT=$$(pwd)/$@", - "TMP=$$(mktemp -d $${TMPDIR:-/tmp}/eclipse_deps.XXXXXXXX)", - "cd $$TMP", - "$$JAR -xf $$IN", - "rm -rf google/registry", - "$$JAR -cmf META-INF/MANIFEST.MF eclipse_deps.jar .", - "mv eclipse_deps.jar $$OUT", - "rm -rf $$TMP", - ]), - tools = [ - "@local_jdk//:bin/jar", - "@local_jdk//:jdk-lib", - "@local_jdk//:jre-default", - ], -) diff --git a/java/google/registry/tools/BUILD b/java/google/registry/tools/BUILD index c65b96d92..0260ee1d5 100644 --- a/java/google/registry/tools/BUILD +++ b/java/google/registry/tools/BUILD @@ -10,7 +10,6 @@ licenses(["notice"]) # Apache 2.0 package_group( name = "allowed-tools", packages = [ - "//java/google/registry/eclipse", "//java/google/registry/testing", "//java/google/registry/tools", "//javatests/google/registry/testing", diff --git a/javatests/google/registry/rde/RdeTestSuite.java b/javatests/google/registry/rde/RdeTestSuite.java index 4d2723345..94bfd762d 100644 --- a/javatests/google/registry/rde/RdeTestSuite.java +++ b/javatests/google/registry/rde/RdeTestSuite.java @@ -18,7 +18,7 @@ import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; -/** Convenience class for jart@ so she can run all RDE tests inside Eclipse with one keystroke. */ +/** Convenience class to run all RDE tests inside IDE with one keystroke. */ @RunWith(Suite.class) @SuiteClasses({ DomainResourceToXjcConverterTest.class, diff --git a/javatests/google/registry/testing/InjectRule.java b/javatests/google/registry/testing/InjectRule.java index a1629f70e..d8dccd097 100644 --- a/javatests/google/registry/testing/InjectRule.java +++ b/javatests/google/registry/testing/InjectRule.java @@ -27,30 +27,26 @@ import org.junit.rules.ExternalResource; /** * JUnit Rule for overriding {@code private static} fields during a test. * - *
This rule uses reflection to change the value of a field while your test - * is running and then restore it to its original value after it's done (even - * if the test fails). The injection will work even if the field is marked - * {@code private} (but not if it's {@code final}). The downside is that if you - * rename the field in the future, Eclipse refactoring won't be smart enough to - * update the injection site. + *
This rule uses reflection to change the value of a field while your test is running and then + * restore it to its original value after it's done (even if the test fails). The injection will + * work even if the field is marked {@code private} (but not if it's {@code final}). The downside is + * that if you rename the field in the future, IDE refactoring won't be smart enough to update the + * injection site. * - *
We encourage you to consider using - * {@link google.registry.util.NonFinalForTesting @NonFinalForTesting} - * to document your injected fields. + *
We encourage you to consider using {@link google.registry.util.NonFinalForTesting + * @NonFinalForTesting} to document your injected fields. * - *
This class is a horrible evil hack, but it alleviates you of the toil of - * having to break encapsulation by making your fields non-{@code private}, using - * the {@link com.google.common.annotations.VisibleForTesting @VisibleForTesting} - * annotation to document why you've reduced visibility, creating a temporary field - * to store the old value, and then writing an {@link org.junit.After @After} - * method to restore it. So sometimes it feels good to be evil; but hopefully one - * day we'll be able to delete this class and do things properly with - * Dagger dependency injection. + *
This class is a horrible evil hack, but it alleviates you of the toil of having to break + * encapsulation by making your fields non-{@code private}, using the {@link + * com.google.common.annotations.VisibleForTesting @VisibleForTesting} annotation to document + * why you've reduced visibility, creating a temporary field to store the old value, and then + * writing an {@link org.junit.After @After} method to restore it. So sometimes it feels good + * to be evil; but hopefully one day we'll be able to delete this class and do things + * properly with Dagger dependency injection. * - *
You use this class by declaring it as a {@link org.junit.Rule @Rule} - * field and then calling {@link #setStaticField} from either your {@link - * org.junit.Test @Test} or {@link org.junit.Before @Before} methods. For - * example: + *
You use this class by declaring it as a {@link org.junit.Rule @Rule} field and then + * calling {@link #setStaticField} from either your {@link org.junit.Test @Test} or {@link + * org.junit.Before @Before} methods. For example: * *
* // Doomsday.java diff --git a/javatests/google/registry/tmch/TmchTestSuite.java b/javatests/google/registry/tmch/TmchTestSuite.java index 630b057b1..9917ca32d 100644 --- a/javatests/google/registry/tmch/TmchTestSuite.java +++ b/javatests/google/registry/tmch/TmchTestSuite.java @@ -18,7 +18,7 @@ import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; -/** Convenience class to run all TMCH tests inside Eclipse with one keystroke. */ +/** Convenience class to run all TMCH tests inside IDE with one keystroke. */ @RunWith(Suite.class) @SuiteClasses({ LordnTaskTest.class, diff --git a/scripts/setup_eclipse.py b/scripts/setup_eclipse.py deleted file mode 100644 index 8e6f9d936..000000000 --- a/scripts/setup_eclipse.py +++ /dev/null @@ -1,290 +0,0 @@ -#!/usr/bin/python -# Copyright 2017 The Nomulus Authors. All Rights Reserved. -# -# 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. - -"""Script for generating eclipse .project and .classpath files.""" - -import os -import subprocess -import sys - - -def bazel_info(key): - """Invokes the bazel info subcommand. - - Invokes bazel info on the command line, parses the output and returns it - - Args: - key: The argument that is passed to bazel info. See - http://bazel.io/docs/bazel-user-manual.html#info for example values. - - Returns: - The output of the bazel info invocation as a string. If multiple lines - are returned by bazel info, only the first line is returned. - """ - bazel_process = subprocess.Popen(["bazel", "info", key], - stdout=subprocess.PIPE) - result = [line.strip() for line in iter(bazel_process.stdout.readline, "")] - return result[0] - - -def classpath_entry_xml(kind, path): - """Generates an eclipse xml classpath entry. - - Args: - kind: Kind of classpath entry. - Example values are 'lib', 'src', and 'con' - path: Absolute or relative path to the referenced resource. - Paths that are not absolute are relative to the project root. - - Returns: - xml classpath entry element with the specified kind and path. - """ - return "".format( - kind=kind, path=path) - - -def classpath_xml(entries): - """Produces the xml for an eclipse classpath file. - - Args: - entries: list of dictionaries in the form of: - { - "kind": (str), - "path": (str) - } - - Returns: - Contents of the eclipse .classpath file. - """ - entries_xml = "\n".join( - [" " + classpath_entry_xml(**entry) for entry in entries]) - return ('\n' - " \n" - "{entries}" - "\n ").format(entries=entries_xml) - - -def build_classpath(): - """Builds eclipse classpath file. - - Generates an eclipse .classpath file that has references to all of the - project source folders, autogenerated source code, and external binary - dependencies. - - Returns: - Contents of the eclipse .classpath file. - """ - # source folder for autogenerated files must reference - # symlinked bazel-genfiles folder inside of the project. - bazel_genfiles = bazel_info("bazel-genfiles") - classpath_entries = [ - {"kind": "con", "path": "org.eclipse.jdt.launching.JRE_CONTAINER"}, - {"kind": "src", "path": "java"}, - {"kind": "src", "path": "javatests"}, - {"kind": "src", "path": "bazel-genfiles/java"}, - { - "kind": "lib", - "path": ("%s/java/google/" - "registry/eclipse/eclipse_deps.jar" % bazel_genfiles) - }, - {"kind": "output", "path": "bin"}, - ] - return classpath_xml(classpath_entries) - - -def build_project(project_name): - """Builds eclipse project file. - - Uses a very simple template to generate an eclipse .project file - with a configurable project name. - - Args: - project_name: Name of the eclipse project. When importing the project - into an eclipse workspace, this is the name that will be shown. - Returns: - Contents of the eclipse .project file. - """ - template = """ -- """ - return template.format(project_name=project_name) - - -def factorypath_entry_xml(kind, entry_id): - """Generates an eclipse xml factorypath entry. - - Args: - kind: Kind of factorypath entry. - Example values are 'PLUGIN', 'WKSPJAR' - entry_id: Unique identifier for the factorypath entry - - Returns: - xml factorypath entry element with the specified kind and id. - """ - return ("{project_name} -- -- -- -- -org.python.pydev.PyDevBuilder -- -- -org.eclipse.jdt.core.javabuilder -- -- -org.eclipse.jdt.core.javanature -org.python.pydev.pythonNature -").format( - kind=kind, entry_id=entry_id) - - -def factorypath_xml(entries): - """Produces the xml for an eclipse factorypath file. - - Args: - entries: list of dictionaries in the form of: - { - "kind": (str), - "entry_id": (str) - } - - Returns: - Contents of the eclipse .factorypath file. - """ - entries_xml = "\n".join( - [" " + factorypath_entry_xml(**entry) for entry in entries]) - return (" \n" - "{entries}" - "\n ").format(entries=entries_xml) - - -def build_factorypath(): - """Builds eclipse factorypath file. - - Generates an eclipse .factorypath file that links to the jar containing - all required annotation processors for the project. - - Returns: - Contents of the eclipse .factorypath file. - """ - bazel_bin = bazel_info("bazel-bin") - annotations_jar = os.path.join( - bazel_bin, - "java/google/registry/eclipse" - "/annotation_processors_ide_deploy.jar") - factorypath_entries = [ - { - "kind": "PLUGIN", - "entry_id": "org.eclipse.jst.ws.annotations.core", - }, - { - "kind": "EXTJAR", - "entry_id": annotations_jar, - } - ] - return factorypath_xml(factorypath_entries) - - -def build_dependencies(): - """Builds dependencies for producing eclipse project files. - - Runs bazel build for the entire project and builds a single jar with all - binary dependencies for eclipse to compile the project. - - Raises: - subprocess.CalledProcessError: A bazel build failed - """ - # Build entire project first - subprocess.check_call([ - "bazel", - "build", - "//java/google/registry/...", - "//javatests/google/registry/...", - ]) - - # Builds a giant jar of all compile-time dependencies of the project - subprocess.check_call([ - "bazel", - "build", - "//java/google/registry/eclipse:eclipse_deps", - ]) - - # Builds a jar with all annotation processors - subprocess.check_call([ - "bazel", - "build", - "//java/google/registry/eclipse" - ":annotation_processors_ide_deploy.jar", - ]) - - -def main(): - """Builds eclipse project files. - - Before building the eclipse files, a working bazel build is required. - After building the eclipse dependencies jar and the tests, eclipse - project files are produced. - """ - build_dependencies() - workspace_directory = bazel_info("workspace") - classpath = build_classpath() - with open(os.path.join(workspace_directory, ".classpath"), - "w") as classpath_file: - classpath_file.write(classpath) - if len(sys.argv) > 1: - project_name = sys.argv[1] - else: - project_name = "domain-registry" - project = build_project(project_name) - with open(os.path.join(workspace_directory, ".project"), - "w") as project_file: - project_file.write(project) - factorypath = build_factorypath() - with open(os.path.join(workspace_directory, ".factorypath"), - "w") as factorypath_file: - factorypath_file.write(factorypath) - if not os.path.exists(".settings"): - os.makedirs(".settings") - # XXX: Avoid wiping out existing settings from org.eclipse.jdt.core.prefs - with open(os.path.join(workspace_directory, - ".settings", - "org.eclipse.jdt.core.prefs"), "w") as prefs_file: - prefs_file.write("\n".join([ - "eclipse.preferences.version=1", - "org.eclipse.jdt.core.compiler.processAnnotations=enabled", - ])) - with open(os.path.join(workspace_directory, - ".settings", - "org.eclipse.jdt.apt.core.prefs"), - "w") as prefs_file: - prefs_file.write("\n".join([ - "eclipse.preferences.version=1", - "org.eclipse.jdt.apt.aptEnabled=true", - "org.eclipse.jdt.apt.genSrcDir=autogenerated", - "org.eclipse.jdt.apt.reconcileEnabled=true", - ])) - - -if __name__ == "__main__": - main()