You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ol...@apache.org on 2017/06/16 11:12:50 UTC
[1/2] ambari git commit: AMBARI-21257. Add ambari prefix for utility
and serviceadvisor modules (oleewere)
Repository: ambari
Updated Branches:
refs/heads/trunk c52faea36 -> 1fbb933ef
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/serviceadvisor/src/main/java/org/apache/ambari/serviceadvisor/ServiceAdvisor.java
----------------------------------------------------------------------
diff --git a/serviceadvisor/src/main/java/org/apache/ambari/serviceadvisor/ServiceAdvisor.java b/serviceadvisor/src/main/java/org/apache/ambari/serviceadvisor/ServiceAdvisor.java
deleted file mode 100644
index 77c482a..0000000
--- a/serviceadvisor/src/main/java/org/apache/ambari/serviceadvisor/ServiceAdvisor.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/**
- * 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.ambari.serviceadvisor;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.commons.lang3.EnumUtils;
-import org.apache.commons.lang.StringUtils;
-
-/**
- * Class that can be called either through its jar or using its run method.
- * The goal is to invoke a Service Advisor.
- * Right now, it is backward compatible by invoking the python script and does not know which service is affected.
- */
-public class ServiceAdvisor {
- protected static Log LOG = LogFactory.getLog(ServiceAdvisor.class);
-
- private static String USAGE = "Usage: java -jar serviceadvisor.jar [ACTION] [HOSTS_FILE.json] [SERVICES_FILE.json] [OUTPUT.txt] [ERRORS.txt]";
- private static String PYTHON_STACK_ADVISOR_SCRIPT = "/var/lib/ambari-server/resources/scripts/stack_advisor.py";
-
- /**
- * Entry point for calling this class through its jar.
- * @param args
- */
- public static void main(String[] args) {
- if (args.length != 5) {
- System.err.println(String.format("Wrong number of arguments. %s", USAGE));
- System.exit(1);
- }
-
- String action = args[0];
- String hostsFile = args[1];
- String servicesFile = args[2];
- String outputFile = args[3];
- String errorFile = args[4];
-
- int exitCode = run(action, hostsFile, servicesFile, outputFile, errorFile);
- System.exit(exitCode);
- }
-
- public static int run(String action, String hostsFile, String servicesFile, String outputFile, String errorFile) {
- LOG.info(String.format("ServiceAdvisor. Received arguments. Action: %s, Hosts File: %s, Services File: %s", action, hostsFile, servicesFile));
- int returnCode = -1;
-
- try {
- ServiceAdvisorCommandType commandType = ServiceAdvisorCommandType.getEnum(action);
-
- // TODO, load each Service's Service Advisor at Start Time and call it instead of Python command below.
-
- ProcessBuilder builder = preparePythonShellCommand(commandType, hostsFile, servicesFile, outputFile, errorFile);
- returnCode = launchProcess(builder);
- } catch (IllegalArgumentException e) {
- List<ServiceAdvisorCommandType> values = EnumUtils.getEnumList(ServiceAdvisorCommandType.class);
- List<String> stringValues = new ArrayList<String>();
- for (ServiceAdvisorCommandType value : values) {
- stringValues.add(value.toString());
- }
- LOG.error("ServiceAdvisor. Illegal Argument. Action must be one of " + StringUtils.join(stringValues.toArray(), ", "));
- return -1;
- } catch (Exception e) {
- LOG.error("ServiceAdvisor. Failed with " + e.getMessage());
- return -1;
- }
- return returnCode;
- }
-
- /**
- * Generate a process to invoke a Python command for the old-style Stack Advisor.
- * @param commandType Command Type
- * @param hostsFile hosts.json file
- * @param servicesFile services.json file
- * @param outputFile output.txt
- * @param errorFile error.txt
- * @return Process that can launch.
- */
- private static ProcessBuilder preparePythonShellCommand(ServiceAdvisorCommandType commandType, String hostsFile, String servicesFile, String outputFile, String errorFile) {
- List<String> builderParameters = new ArrayList<String>();
-
- if (System.getProperty("os.name").contains("Windows")) {
- builderParameters.add("cmd");
- builderParameters.add("/c");
- } else {
- builderParameters.add("sh");
- builderParameters.add("-c");
- }
-
- StringBuilder commandString = new StringBuilder();
- commandString.append(PYTHON_STACK_ADVISOR_SCRIPT + " ");
-
- commandString.append(commandType.toString()).append(" ");
- commandString.append(hostsFile).append(" ");
- commandString.append(servicesFile).append(" ");
- commandString.append("1> ");
- commandString.append(outputFile).append(" ");
- commandString.append("2>");
- commandString.append(errorFile).append(" ");
-
- builderParameters.add(commandString.toString());
-
- LOG.info("ServiceAdvisor. Python command is: " + builderParameters.toString());
-
- return new ProcessBuilder(builderParameters);
- }
-
- /**
- * Launch a process, wait for it to finish, and return its exit code.
- * @param builder Process Builder
- * @return Exit Code
- * @throws Exception
- */
- private static int launchProcess(ProcessBuilder builder) throws Exception {
- int exitCode = -1;
- Process process = null;
- try {
- process = builder.start();
- exitCode = process.waitFor();
- } catch (Exception ioe) {
- String message = "Error executing Service Advisor: ";
- LOG.error(message, ioe);
- throw new Exception(message + ioe.getMessage());
- } finally {
- if (process != null) {
- process.destroy();
- }
- }
- return exitCode;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/serviceadvisor/src/main/java/org/apache/ambari/serviceadvisor/ServiceAdvisorCommandType.java
----------------------------------------------------------------------
diff --git a/serviceadvisor/src/main/java/org/apache/ambari/serviceadvisor/ServiceAdvisorCommandType.java b/serviceadvisor/src/main/java/org/apache/ambari/serviceadvisor/ServiceAdvisorCommandType.java
deleted file mode 100644
index f067668..0000000
--- a/serviceadvisor/src/main/java/org/apache/ambari/serviceadvisor/ServiceAdvisorCommandType.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * 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.ambari.serviceadvisor;
-
-
-// TODO, use this class instead of org.apache.ambari.server.api.services.stackadvisor.commands.StackAdvisorCommandType
-public enum ServiceAdvisorCommandType {
-
- RECOMMEND_COMPONENT_LAYOUT("recommend-component-layout"),
-
- VALIDATE_COMPONENT_LAYOUT("validate-component-layout"),
-
- RECOMMEND_CONFIGURATIONS("recommend-configurations"),
-
- RECOMMEND_CONFIGURATION_DEPENDENCIES("recommend-configuration-dependencies"),
-
- VALIDATE_CONFIGURATIONS("validate-configurations");
- private final String name;
-
- private ServiceAdvisorCommandType(String name) {
- this.name = name;
- }
-
- public String getValue() {
- return this.name.toLowerCase();
- }
-
- @Override
- public String toString() {
- return this.name;
- }
-
- /**
- * Instead of Enum.valueOf("value"), use this method instead to map the string to the correct Enum.
- * @param name Name with lowercase and dashes.
- * @return Enum that matches the string.
- */
- public static ServiceAdvisorCommandType getEnum(String name) {
- for (ServiceAdvisorCommandType v : values()) {
- if (v.getValue().equalsIgnoreCase(name.replace("_", "-"))) {
- return v;
- }
- }
- throw new IllegalArgumentException();
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/utility/checkstyle.xml
----------------------------------------------------------------------
diff --git a/utility/checkstyle.xml b/utility/checkstyle.xml
deleted file mode 100644
index 2e7d6f0..0000000
--- a/utility/checkstyle.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0"?>
-<!-- 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.
- See accompanying LICENSE file. -->
-<!DOCTYPE module PUBLIC
- "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
- "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
-<module name="Checker">
- <module name="TreeWalker">
- <module name="FallThrough"/>
-
- <!-- imports -->
- <module name="AvoidStarImport"/>
- <module name="IllegalImport"/>
- <module name="ImportOrder">
- <property name="groups" value="java,javax,org,com,*"/>
- <property name="ordered" value="true"/>
- <property name="separated" value="true"/>
- <property name="option" value="top"/> <!-- static imports -->
- <property name="sortStaticImportsAlphabetically" value="true"/>
- </module>
- <module name="RedundantImport"/>
- <module name="UnusedImports"/>
-
- <!-- blocks -->
- <module name="AvoidNestedBlocks">
- <property name="allowInSwitchCase" value="true"/>
- </module>
- <module name="EmptyBlock">
- <property name="option" value="text"/>
- </module>
- </module>
-</module>
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/utility/pom.xml
----------------------------------------------------------------------
diff --git a/utility/pom.xml b/utility/pom.xml
deleted file mode 100644
index ac91474..0000000
--- a/utility/pom.xml
+++ /dev/null
@@ -1,145 +0,0 @@
-<?xml version="1.0"?>
-<!--
- 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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.apache.ambari</groupId>
- <artifactId>ambari-project</artifactId>
- <version>2.0.0.0-SNAPSHOT</version>
- <relativePath>../ambari-project</relativePath>
- </parent>
-
- <artifactId>utility</artifactId>
- <groupId>utility</groupId>
- <version>1.0.0.0-SNAPSHOT</version>
-
- <dependencies>
- <dependency>
- <groupId>com.github.kongchen</groupId>
- <artifactId>swagger-maven-plugin</artifactId>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <scope>compile</scope> <!-- has to be compile-time dependency on junit -->
- </dependency>
- <dependency>
- <groupId>com.puppycrawl.tools</groupId>
- <artifactId>checkstyle</artifactId>
- </dependency>
- <dependency>
- <groupId>com.puppycrawl.tools</groupId>
- <artifactId>checkstyle</artifactId>
- <type>test-jar</type>
- <version>${checkstyle.version}</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- <version>19.0</version> <!-- required for checkstyle -->
- </dependency>
- <dependency>
- <groupId>org.easymock</groupId>
- <artifactId>easymock</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.2</version>
- <configuration>
- <source>1.7</source>
- <target>1.7</target>
- <useIncrementalCompilation>false</useIncrementalCompilation>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.vafer</groupId>
- <artifactId>jdeb</artifactId>
- <version>1.0.1</version>
- <executions>
- <execution>
- <!--Stub execution on direct plugin call - workaround for ambari deb build process-->
- <id>stub-execution</id>
- <phase>none</phase>
- <goals>
- <goal>jdeb</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <skip>true</skip>
- <attach>false</attach>
- <submodules>false</submodules>
- <controlDir>${project.basedir}/../src/main/package/deb/control</controlDir>
- </configuration>
- </plugin>
- <plugin>
- <artifactId>maven-assembly-plugin</artifactId>
- <configuration>
- <descriptors>
- <descriptor>${project.parent.basedir}/src/main/assemblies/empty.xml</descriptor>
- </descriptors>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>rpm-maven-plugin</artifactId>
- <version>2.0.1</version>
- <executions>
- <execution>
- <!-- unbinds rpm creation from maven lifecycle -->
- <phase>none</phase>
- <goals>
- <goal>rpm</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <copyright>2012, Apache Software Foundation</copyright>
- <group>Development</group>
- <disabled>true</disabled>
- <description>Maven Recipe: RPM Package.</description>
- <mappings/>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-checkstyle-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
-</project>
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/utility/src/main/java/category/AlertTest.java
----------------------------------------------------------------------
diff --git a/utility/src/main/java/category/AlertTest.java b/utility/src/main/java/category/AlertTest.java
deleted file mode 100644
index b6a20ec..0000000
--- a/utility/src/main/java/category/AlertTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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 category;
-
-/**
- * Category of unit tests that can be annotated. E.g.,
- * {@code @Category({ category.AlertTest.class}) }
- *
- * A Profile can have csv of categories, in order to run the unit tests like,
- * mvn clean test -P AlertTests
- */
-public interface AlertTest {}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/utility/src/main/java/category/AmbariUpgradeTest.java
----------------------------------------------------------------------
diff --git a/utility/src/main/java/category/AmbariUpgradeTest.java b/utility/src/main/java/category/AmbariUpgradeTest.java
deleted file mode 100644
index 881107a..0000000
--- a/utility/src/main/java/category/AmbariUpgradeTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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 category;
-
-/**
- * Category of unit tests that can be annotated. E.g.,
- * {@code @Category({ category.AmbariUpgradeTest.class}) }
- *
- * A Profile can have csv of categories, in order to run the unit tests like,
- * mvn clean test -P AmbariUpgradeTests
- */
-public interface AmbariUpgradeTest {}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/utility/src/main/java/category/BlueprintTest.java
----------------------------------------------------------------------
diff --git a/utility/src/main/java/category/BlueprintTest.java b/utility/src/main/java/category/BlueprintTest.java
deleted file mode 100644
index cb7871d..0000000
--- a/utility/src/main/java/category/BlueprintTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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 category;
-
-/**
- * Category of unit tests that can be annotated. E.g.,
- * {@code @Category({ category.BlueprintTest.class}) }
- *
- * A Profile can have csv of categories, in order to run the unit tests like,
- * mvn clean test -P BlueprintTests
- */
-public interface BlueprintTest {}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/utility/src/main/java/category/FastTest.java
----------------------------------------------------------------------
diff --git a/utility/src/main/java/category/FastTest.java b/utility/src/main/java/category/FastTest.java
deleted file mode 100644
index a0abddf..0000000
--- a/utility/src/main/java/category/FastTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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 category;
-
-/**
- * Category of unit tests that can be annotated. E.g.,
- * {@code @Category({ category.FastTest.class}) }
- *
- * A Profile can have csv of categories, in order to run the unit tests like,
- * mvn clean test -P FastTests
- */
-public interface FastTest {}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/utility/src/main/java/category/KerberosTest.java
----------------------------------------------------------------------
diff --git a/utility/src/main/java/category/KerberosTest.java b/utility/src/main/java/category/KerberosTest.java
deleted file mode 100644
index f7cebdf..0000000
--- a/utility/src/main/java/category/KerberosTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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 category;
-
-/**
- * Category of unit tests that can be annotated. E.g.,
- * {@code @Category({ category.KerberosTest.class}) }
- *
- * A Profile can have csv of categories, in order to run the unit tests like,
- * mvn clean test -P KerberosTests
- */
-public interface KerberosTest {}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/utility/src/main/java/category/MetricsTest.java
----------------------------------------------------------------------
diff --git a/utility/src/main/java/category/MetricsTest.java b/utility/src/main/java/category/MetricsTest.java
deleted file mode 100644
index a352ae2..0000000
--- a/utility/src/main/java/category/MetricsTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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 category;
-
-/**
- * Category of unit tests that can be annotated. E.g.,
- * {@code @Category({ category.MetricsTest.class}) }
- *
- * A Profile can have csv of categories, in order to run the unit tests like,
- * mvn clean test -P MetricsTests
- */
-public interface MetricsTest {}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/utility/src/main/java/category/SlowTest.java
----------------------------------------------------------------------
diff --git a/utility/src/main/java/category/SlowTest.java b/utility/src/main/java/category/SlowTest.java
deleted file mode 100644
index c1025a9..0000000
--- a/utility/src/main/java/category/SlowTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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 category;
-
-/**
- * Category of unit tests that can be annotated. E.g.,
- * {@code @Category({ category.SlowTest.class}) }
- *
- * A Profile can have csv of categories, in order to run the unit tests like,
- * mvn clean test -P SlowTests
- */
-public interface SlowTest {}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/utility/src/main/java/category/StackUpgradeTest.java
----------------------------------------------------------------------
diff --git a/utility/src/main/java/category/StackUpgradeTest.java b/utility/src/main/java/category/StackUpgradeTest.java
deleted file mode 100644
index 20a1723..0000000
--- a/utility/src/main/java/category/StackUpgradeTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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 category;
-
-/**
- * Category of unit tests that can be annotated. E.g.,
- * {@code @Category({ category.StackUpgradeTest.class}) }
- *
- * A Profile can have csv of categories, in order to run the unit tests like,
- * mvn clean test -P StackUpgradeTests
- */
-public interface StackUpgradeTest {}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/utility/src/main/java/org/apache/ambari/annotations/ApiIgnore.java
----------------------------------------------------------------------
diff --git a/utility/src/main/java/org/apache/ambari/annotations/ApiIgnore.java b/utility/src/main/java/org/apache/ambari/annotations/ApiIgnore.java
deleted file mode 100644
index d50c2fd..0000000
--- a/utility/src/main/java/org/apache/ambari/annotations/ApiIgnore.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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.ambari.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Retention(RetentionPolicy.SOURCE)
-@Target({ElementType.METHOD})
-public @interface ApiIgnore {
- // marker
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/utility/src/main/java/org/apache/ambari/checkstyle/AvoidTransactionalOnPrivateMethodsCheck.java
----------------------------------------------------------------------
diff --git a/utility/src/main/java/org/apache/ambari/checkstyle/AvoidTransactionalOnPrivateMethodsCheck.java b/utility/src/main/java/org/apache/ambari/checkstyle/AvoidTransactionalOnPrivateMethodsCheck.java
deleted file mode 100644
index 80da103..0000000
--- a/utility/src/main/java/org/apache/ambari/checkstyle/AvoidTransactionalOnPrivateMethodsCheck.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.ambari.checkstyle;
-
-import com.puppycrawl.tools.checkstyle.api.AbstractCheck;
-import com.puppycrawl.tools.checkstyle.api.DetailAST;
-import com.puppycrawl.tools.checkstyle.api.TokenTypes;
-
-/**
- * Detects private methods annotated as <code>Transactional</code>.
- * See https://github.com/google/guice/wiki/Transactions for why this should be
- * avoided.
- */
-public class AvoidTransactionalOnPrivateMethodsCheck extends AbstractCheck {
-
- private static final String ANNOTATION_NAME = "Transactional";
- public static final String MSG_TRANSACTIONAL_ON_PRIVATE_METHOD = "@" + ANNOTATION_NAME + " should not be used on private methods";
-
- @Override
- public int[] getDefaultTokens() {
- return new int[] { TokenTypes.METHOD_DEF };
- }
-
- @Override
- public void visitToken(DetailAST ast) {
- DetailAST modifiers = ast.findFirstToken(TokenTypes.MODIFIERS);
- if (modifiers.findFirstToken(TokenTypes.LITERAL_PRIVATE) != null) {
- DetailAST annotation = modifiers.findFirstToken(TokenTypes.ANNOTATION);
- while (annotation != null) {
- DetailAST name = annotation.findFirstToken(TokenTypes.IDENT);
- if (name != null && ANNOTATION_NAME.equals(name.getText())) {
- log(ast.getLineNo(), MSG_TRANSACTIONAL_ON_PRIVATE_METHOD);
- break;
- }
- annotation = annotation.getNextSibling();
- }
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/utility/src/main/java/org/apache/ambari/checkstyle/UndocumentedRestApiOperationCheck.java
----------------------------------------------------------------------
diff --git a/utility/src/main/java/org/apache/ambari/checkstyle/UndocumentedRestApiOperationCheck.java b/utility/src/main/java/org/apache/ambari/checkstyle/UndocumentedRestApiOperationCheck.java
deleted file mode 100644
index c6347db..0000000
--- a/utility/src/main/java/org/apache/ambari/checkstyle/UndocumentedRestApiOperationCheck.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * 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.ambari.checkstyle;
-
-import java.util.Set;
-
-import com.google.common.collect.ImmutableSet;
-import com.puppycrawl.tools.checkstyle.api.AbstractCheck;
-import com.puppycrawl.tools.checkstyle.api.DetailAST;
-import com.puppycrawl.tools.checkstyle.api.TokenTypes;
-import com.puppycrawl.tools.checkstyle.utils.AnnotationUtility;
-
-/**
- * REST API operations should either be documented, or marked to be ignored.
- */
-public class UndocumentedRestApiOperationCheck extends AbstractCheck {
-
- private static final Set<String> API_ANNOTATIONS = ImmutableSet.of("DELETE", "GET", "HEAD", "OPTIONS", "PUT", "POST");
- private static final String API_OPERATION = "ApiOperation";
- private static final String API_IGNORE = "ApiIgnore";
- public static final String MESSAGE = "REST API operation should be documented";
-
- @Override
- public int[] getDefaultTokens() {
- return new int[] { TokenTypes.METHOD_DEF };
- }
-
- @Override
- public void visitToken(DetailAST ast) {
- if (isApiOperation(ast) && !isDocumentedApiOperation(ast) && !isIgnoredApi(ast)) {
- log(ast.getLineNo(), MESSAGE);
- }
- }
-
- private static boolean isApiOperation(DetailAST ast) {
- DetailAST modifiers = ast.findFirstToken(TokenTypes.MODIFIERS);
- if (modifiers.findFirstToken(TokenTypes.LITERAL_PRIVATE) != null) {
- return false;
- }
-
- DetailAST annotation = modifiers.findFirstToken(TokenTypes.ANNOTATION);
- while (annotation != null) {
- DetailAST name = annotation.findFirstToken(TokenTypes.IDENT);
- if (name != null && API_ANNOTATIONS.contains(name.getText())) {
- return true;
- }
- annotation = annotation.getNextSibling();
- }
-
- return false;
- }
-
- private static boolean isDocumentedApiOperation(DetailAST ast) {
- return AnnotationUtility.containsAnnotation(ast, API_OPERATION);
- }
-
- private static boolean isIgnoredApi(DetailAST ast) {
- return AnnotationUtility.containsAnnotation(ast, API_IGNORE);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/utility/src/main/java/org/apache/ambari/swagger/AmbariSwaggerReader.java
----------------------------------------------------------------------
diff --git a/utility/src/main/java/org/apache/ambari/swagger/AmbariSwaggerReader.java b/utility/src/main/java/org/apache/ambari/swagger/AmbariSwaggerReader.java
deleted file mode 100644
index e258fc4..0000000
--- a/utility/src/main/java/org/apache/ambari/swagger/AmbariSwaggerReader.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * 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.ambari.swagger;
-
-import java.lang.reflect.Method;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.ws.rs.Path;
-
-import org.apache.maven.plugin.logging.Log;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.core.annotation.AnnotationUtils;
-
-import com.github.kongchen.swagger.docgen.reader.JaxrsReader;
-import com.google.common.base.Function;
-import com.google.common.base.Predicates;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-import io.swagger.annotations.Api;
-import io.swagger.models.Operation;
-import io.swagger.models.Swagger;
-import io.swagger.models.Tag;
-import io.swagger.models.parameters.Parameter;
-import io.swagger.models.parameters.PathParameter;
-
-/**
- * Customized {@link com.github.kongchen.swagger.docgen.reader.ClassSwaggerReader} implementation to
- * treat nested API's.
- */
-public class AmbariSwaggerReader extends JaxrsReader {
-
- /**
- * Logger instance.
- */
- protected final static Logger logger = LoggerFactory.getLogger(AmbariSwaggerReader.class);
-
- public AmbariSwaggerReader(Swagger swagger, Log LOG) {
- super(swagger, LOG);
- }
-
- private final Map<Class<?>, NestedApiRecord> nestedAPIs = Maps.newHashMap();
-
- @Override
- public Swagger getSwagger() {
- if (null == this.swagger) {
- this.swagger = new Swagger();
- }
- return this.swagger;
- }
-
- /**
- * Original method is overwritten so that to gather information about top level api - nested api relations
- */
- @Override
- public Swagger read(Set<Class<?>> classes) {
- // scan for and register nested API classes
- logger.debug("Looking for nested API's");
- for (Class<?> cls: classes) {
- logger.debug("Examining API {}", cls.getSimpleName());
- for (Method method: cls.getMethods()) {
- Path methodPath = AnnotationUtils.findAnnotation(method, Path.class);
- if (null != methodPath) {
- Class<?> returnType = method.getReturnType();
- Api nestedApi = AnnotationUtils.findAnnotation(returnType, Api.class);
- Path nestedApiPath = AnnotationUtils.findAnnotation(returnType, Path.class);
- logger.debug("Examinig API method {}#{}, path={}, returnType={}", cls.getSimpleName(), method.getName(),
- nestedApiPath != null ? nestedApiPath.value() : null, returnType.getSimpleName());
- if (null != nestedApi) {
- if (null != nestedApiPath) {
- logger.info("This class exists both as top level and nested API: {}, treating it as top level API",
- returnType.getName());
- }
- else {
- Path apiPath = AnnotationUtils.findAnnotation(cls, Path.class);
- String apiPathValue;
- if (null == apiPath) {
- logger.warn("Parent api {} also seems to be a nested API. The current version does not support " +
- "multi-level nesting.");
- apiPathValue = "";
- }
- else {
- apiPathValue = apiPath.value();
- }
- NestedApiRecord nar = new NestedApiRecord(returnType, cls, apiPathValue, method, methodPath.value());
- if (nestedAPIs.containsKey(returnType)) {
- logger.warn("{} is a nested API of multiple top level API's. Ignoring top level API {}", returnType, cls);
- }
- else {
- logger.info("Registering nested API: {}", returnType);
- nestedAPIs.put(returnType, nar);
- }
- }
- }
- }
- }
- }
- logger.info("Found {} nested API's", nestedAPIs.size());
- // With all information gathered, call superclass implementation
- return super.read(classes);
- }
-
- /**
- * Original method is overwritten to handle nested api's properly
- */
- @Override
- protected Swagger read(Class<?> cls, String parentPath,
- String parentMethod,
- boolean readHidden,
- String[] parentConsumes,
- String[] parentProduces,
- Map<String, Tag> parentTags,
- List<Parameter> parentParameters) {
- NestedApiRecord nestedApiRecord = nestedAPIs.get(cls);
- if (null != nestedApiRecord) {
- logger.info("Processing nested API: {}", nestedApiRecord);
- // Get the path parameters of the parent API method. All methods of the nested API class should include these
- // parameters.
- Operation operation = parseMethod(nestedApiRecord.parentMethod);
- List<Parameter> pathParameters = ImmutableList.copyOf(
- Collections2.filter(operation.getParameters(), Predicates.instanceOf(PathParameter.class)));
- logger.info("Will copy path params from parent method: {}",
- Lists.transform(pathParameters, new ParameterToName()));
- return super.read(cls,
- joinPaths(nestedApiRecord.parentApiPath, nestedApiRecord.parentMethodPath, parentPath),
- parentMethod, readHidden,
- parentConsumes, parentProduces, parentTags, pathParameters);
- }
- else {
- logger.info("Processing top level API: {}", cls.getSimpleName());
- return super.read(cls, parentPath, parentMethod, readHidden, parentConsumes, parentProduces, parentTags, parentParameters);
- }
- }
-
- /**
- * Joins path elements properly with slashes avoiding duplicate slashes.
- *
- * @param firstPath the first path element
- * @param paths optionally other path elements
- * @return the joined path
- */
- static String joinPaths(String firstPath, String... paths) {
- StringBuilder joined = new StringBuilder(firstPath);
- for(String path: paths) {
- if (path.isEmpty()) { /* NOP */ }
- else if (joined.length() == 0) {
- joined.append(path);
- }
- else if (joined.charAt(joined.length() - 1) == '/') {
- if (path.startsWith("/")) {
- joined.append(path.substring(1, path.length()));
- }
- else {
- joined.append(path);
- }
- }
- else {
- if (path.startsWith("/")) {
- joined.append(path);
- }
- else {
- joined.append('/').append(path);
- }
-
- }
- }
- return joined.toString();
- }
-}
-
-class ParameterToName implements Function<Parameter, String> {
- public String apply(Parameter input) {
- return input.getName();
- }
-}
-
-class NestedApiRecord {
- final Class<?> nestedApi;
- final Class<?> parentApi;
- final String parentApiPath;
- final Method parentMethod;
- final String parentMethodPath;
-
- public NestedApiRecord(Class<?> nestedApi, Class<?> parentApi, String parentApiPath, Method parentMethod, String parentMethodPath) {
- this.nestedApi = nestedApi;
- this.parentApi = parentApi;
- this.parentApiPath = parentApiPath;
- this.parentMethod = parentMethod;
- this.parentMethodPath = parentMethodPath;
- }
-
- @Override
- public String toString() {
- return "NestedApiRecord {" +
- "nestedApi=" + nestedApi +
- ", parentApi=" + parentApi +
- ", parentApiPath='" + parentApiPath + '\'' +
- ", parentMethod=" + parentMethod +
- ", parentMethodPath='" + parentMethodPath + '\'' +
- '}';
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/utility/src/main/resources/checkstyle_packages.xml
----------------------------------------------------------------------
diff --git a/utility/src/main/resources/checkstyle_packages.xml b/utility/src/main/resources/checkstyle_packages.xml
deleted file mode 100644
index 8cf4a44..0000000
--- a/utility/src/main/resources/checkstyle_packages.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 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.
- See accompanying LICENSE file. -->
-<!DOCTYPE checkstyle-packages PUBLIC
- "-//Puppy Crawl//DTD Package Names 1.0//EN"
- "http://www.puppycrawl.com/dtds/packages_1_0.dtd">
-<checkstyle-packages>
- <package name="org.apache.ambari.checkstyle"/>
-</checkstyle-packages>
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/utility/src/test/java/org/apache/ambari/checkstyle/AvoidTransactionalOnPrivateMethodsCheckTest.java
----------------------------------------------------------------------
diff --git a/utility/src/test/java/org/apache/ambari/checkstyle/AvoidTransactionalOnPrivateMethodsCheckTest.java b/utility/src/test/java/org/apache/ambari/checkstyle/AvoidTransactionalOnPrivateMethodsCheckTest.java
deleted file mode 100644
index bfdbfa1..0000000
--- a/utility/src/test/java/org/apache/ambari/checkstyle/AvoidTransactionalOnPrivateMethodsCheckTest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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.ambari.checkstyle;
-
-import static org.apache.ambari.checkstyle.AvoidTransactionalOnPrivateMethodsCheck.MSG_TRANSACTIONAL_ON_PRIVATE_METHOD;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.junit.Test;
-
-import com.puppycrawl.tools.checkstyle.BaseCheckTestSupport;
-import com.puppycrawl.tools.checkstyle.DefaultConfiguration;
-
-public class AvoidTransactionalOnPrivateMethodsCheckTest extends BaseCheckTestSupport {
-
- @Override
- protected String getPath(String filename) throws IOException {
- return new File("src/test/resources/org/apache/ambari/checkstyle/" + filename)
- .getCanonicalPath();
- }
-
- @Test
- public void transactionalOnPrivateMethod() throws Exception {
- final DefaultConfiguration config = createCheckConfig(AvoidTransactionalOnPrivateMethodsCheck.class);
- final String[] expected = {
- "32: " + MSG_TRANSACTIONAL_ON_PRIVATE_METHOD,
- "41: " + MSG_TRANSACTIONAL_ON_PRIVATE_METHOD,
- };
-
- verify(config, getPath("InputTransactionalOnPrivateMethods.java"), expected);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/utility/src/test/java/org/apache/ambari/checkstyle/UndocumentedRestApiOperationCheckTest.java
----------------------------------------------------------------------
diff --git a/utility/src/test/java/org/apache/ambari/checkstyle/UndocumentedRestApiOperationCheckTest.java b/utility/src/test/java/org/apache/ambari/checkstyle/UndocumentedRestApiOperationCheckTest.java
deleted file mode 100644
index 7caf3cf..0000000
--- a/utility/src/test/java/org/apache/ambari/checkstyle/UndocumentedRestApiOperationCheckTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.ambari.checkstyle;
-
-import static org.apache.ambari.checkstyle.UndocumentedRestApiOperationCheck.MESSAGE;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.junit.Test;
-
-import com.puppycrawl.tools.checkstyle.BaseCheckTestSupport;
-import com.puppycrawl.tools.checkstyle.DefaultConfiguration;
-
-public class UndocumentedRestApiOperationCheckTest extends BaseCheckTestSupport {
-
- @Override
- protected String getPath(String filename) throws IOException {
- return new File("src/test/resources/org/apache/ambari/checkstyle/" + filename)
- .getCanonicalPath();
- }
-
- @Test
- public void test() throws Exception {
- final DefaultConfiguration config = createCheckConfig(UndocumentedRestApiOperationCheck.class);
- final String[] expected = {
- "36: " + MESSAGE,
- "53: " + MESSAGE,
- "70: " + MESSAGE,
- "87: " + MESSAGE,
- "104: " + MESSAGE,
- "121: " + MESSAGE
- };
-
- verify(config, getPath("InputRestApiOperation.java"), expected);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/utility/src/test/java/org/apache/ambari/swagger/AmbariSwaggerReaderTest.java
----------------------------------------------------------------------
diff --git a/utility/src/test/java/org/apache/ambari/swagger/AmbariSwaggerReaderTest.java b/utility/src/test/java/org/apache/ambari/swagger/AmbariSwaggerReaderTest.java
deleted file mode 100644
index a102152..0000000
--- a/utility/src/test/java/org/apache/ambari/swagger/AmbariSwaggerReaderTest.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * 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.ambari.swagger;
-
-import static org.easymock.EasyMock.createMock;
-import static org.junit.Assert.assertEquals ;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-
-import org.apache.commons.collections.set.ListOrderedSet;
-import org.apache.maven.plugin.logging.Log;
-import org.junit.Test;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import io.swagger.models.Response;
-import io.swagger.models.Swagger;
-import io.swagger.models.parameters.Parameter;
-import io.swagger.models.parameters.PathParameter;
-
-public class AmbariSwaggerReaderTest {
-
-
- /**
- * Test the {@link AmbariSwaggerReader#joinPaths(String, String...)} method
- */
- @Test
- public void testJoinPaths() {
- assertEquals("/toplevel/nested/{param}/list",
- AmbariSwaggerReader.joinPaths("", "/", "/", "", "toplevel", "/nested/", "/{param}", "list"));
- assertEquals("/toplevel/nested/{param}/list",
- AmbariSwaggerReader.joinPaths("/", "toplevel", "", "/nested/", "/", "/{param}", "list", ""));
- }
-
- /**
- * Test the basic case: one top level API and one nested API, each with one operation
- */
- @Test
- public void swaggerBasicCase() {
- AmbariSwaggerReader asr = new AmbariSwaggerReader(null, createMock(Log.class));
- Swagger swagger = asr.read(ImmutableSet.of(TopLevelAPI.class, NestedAPI.class));
- assertEquals(ImmutableSet.of("/toplevel/top", "/toplevel/{param}/nested/list"),
- swagger.getPaths().keySet());
- assertPathParamsExist(swagger, "/toplevel/{param}/nested/list", "param");
- }
-
- /**
- * Test conflicting nested API's (the same API's are returned from different top level API's).
- * In this case the nested API should be associated to the first processed top level API.
- */
- @Test
- public void swaggerConflictingNestedApis() {
- AmbariSwaggerReader asr = new AmbariSwaggerReader(null, createMock(Log.class));
- ListOrderedSet classes = ListOrderedSet.decorate(
- Lists.newArrayList(TopLevelAPI.class, AnotherTopLevelAPI.class, NestedAPI.class));
- Swagger swagger = asr.read(classes);
- assertEquals(
- ImmutableSet.of("/toplevel/top", "/toplevel/{param}/nested/list", "/toplevel2/anotherTop"),
- swagger.getPaths().keySet());
- assertPathParamsExist(swagger, "/toplevel/{param}/nested/list", "param");
- }
-
- /**
- * If an API is both top level (the class has a @Path annotation) and nested (class is a return type of an
- * API operation) then it should be treated as top level.
- */
- @Test
- public void swaggerApiThatIsBothTopLevelAndNestedIsCountedAsTopLevel() {
- AmbariSwaggerReader asr = new AmbariSwaggerReader(null, createMock(Log.class));
- Swagger swagger = asr.read(ImmutableSet.of(YetAnotherTopLevelAPI.class, NestedAndTopLevelAPI.class));
- assertEquals(ImmutableSet.of("/toplevel3/yetAnotherTop", "/canBeReachedFromTopToo/list"),
- swagger.getPaths().keySet());
- }
-
-
- /**
- * Verify that the top level API's path parameters are transferred to the nested API.
- */
- private static void assertPathParamsExist(Swagger swagger, String path, String... expectedPathParams) {
- List<Parameter> parameters = swagger.getPath(path).getGet().getParameters();
- assertNotNull("No path parameters for path: " + path, parameters);
- Set<String> pathParamNames = new HashSet<>();
- for (Parameter param: parameters) {
- if (param instanceof PathParameter) {
- pathParamNames.add(param.getName());
- }
- }
- Set<String> missingPathParams = Sets.difference(ImmutableSet.copyOf(expectedPathParams), pathParamNames);
- assertTrue("Expected path params for [" + path + "] are missing: " + missingPathParams, missingPathParams.isEmpty());
- }
-
-}
-
-@Path("/toplevel")
-@Api(value = "Top Level", description = "A top level API")
-abstract class TopLevelAPI {
-
- @GET
- @Path("/top")
- @ApiOperation(value = "list")
- public abstract Response getList();
-
- @Path("{param}/nested")
- public abstract NestedAPI getNested(@ApiParam @PathParam(value = "param") String param);
-}
-
-@Path("/toplevel2")
-@Api(value = "Top Level 2", description = "Another top level API")
-abstract class AnotherTopLevelAPI {
-
- @GET
- @Path("/anotherTop")
- @ApiOperation(value = "list")
- public abstract Response getList();
-
- @Path("{param}/anotherNested")
- public abstract NestedAPI getSecondNested(@ApiParam @PathParam(value = "param") String param);
-
-}
-
-@Path("/toplevel3")
-@Api(value = "Top Level 3", description = "Yet another top level API")
-abstract class YetAnotherTopLevelAPI {
-
- @GET
- @Path("/yetAnotherTop")
- @ApiOperation(value = "list")
- public abstract Response getList();
-
- @Path("{param}/nested")
- public abstract NestedAPI getFirstNested(@ApiParam @PathParam(value = "param") String param);
-
-}
-
-@Api(value = "Nested", description = "A nested API")
-abstract class NestedAPI {
-
- @GET
- @Path("/list")
- @ApiOperation(value = "list")
- public abstract Response getList();
-
-}
-
-@Path("/canBeReachedFromTopToo")
-@Api(value = "Nested and Top Level", description = "An API that is both nested and top level")
-abstract class NestedAndTopLevelAPI {
-
- @GET
- @Path("/list")
- @ApiOperation(value = "list")
- public abstract Response getList();
-
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/utility/src/test/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/utility/src/test/resources/log4j.properties b/utility/src/test/resources/log4j.properties
deleted file mode 100644
index c088bb7..0000000
--- a/utility/src/test/resources/log4j.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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.
-
-# log4j configuration used during build and unit tests
-
-log4j.rootLogger=INFO,stdout
-log4j.threshold=ALL
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c{2} (%F:%M(%L)) - %m%n
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/utility/src/test/resources/org/apache/ambari/checkstyle/InputRestApiOperation.java
----------------------------------------------------------------------
diff --git a/utility/src/test/resources/org/apache/ambari/checkstyle/InputRestApiOperation.java b/utility/src/test/resources/org/apache/ambari/checkstyle/InputRestApiOperation.java
deleted file mode 100644
index 9aa35ba..0000000
--- a/utility/src/test/resources/org/apache/ambari/checkstyle/InputRestApiOperation.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * 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.ambari.checkstyle;
-
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.HEAD;
-import javax.ws.rs.OPTIONS;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-
-import io.swagger.annotations.ApiOperation;
-
-import org.apache.ambari.annotations.ApiIgnore;
-
-/**
- * Input file for UndocumentedRestApiOperationCheck.
- */
-public class InputRestApiOperation {
-
- @DELETE
- public void undocumentedDELETE() {
- ;
- }
-
- @DELETE
- @ApiOperation(value = "...")
- public void documentedDELETE() {
- ;
- }
-
- @DELETE
- @ApiIgnore
- public void ignoredDELETE() {
- ;
- }
-
- @HEAD
- public void undocumentedHEAD() {
- ;
- }
-
- @HEAD
- @ApiOperation(value = "...")
- public void documentedHEAD() {
- ;
- }
-
- @HEAD
- @ApiIgnore
- public void ignoredHEAD() {
- ;
- }
-
- @GET
- public void undocumentedGET() {
- ;
- }
-
- @GET
- @ApiOperation(value = "...")
- public void documentedGET() {
- ;
- }
-
- @GET
- @ApiIgnore
- public void ignoredGET() {
- ;
- }
-
- @OPTIONS
- public void undocumentedOPTIONS() {
- ;
- }
-
- @OPTIONS
- @ApiOperation(value = "...")
- public void documentedOPTIONS() {
- ;
- }
-
- @OPTIONS
- @ApiIgnore
- public void ignoredOPTIONS() {
- ;
- }
-
- @POST
- public void undocumentedPOST() {
- ;
- }
-
- @POST
- @ApiOperation(value = "...")
- public void documentedPOST() {
- ;
- }
-
- @POST
- @ApiIgnore
- public void ignoredPOST() {
- ;
- }
-
- @PUT
- public void undocumentedPUT() {
- ;
- }
-
- @PUT
- @ApiOperation(value = "...")
- public void documentedPUT() {
- ;
- }
-
- @PUT
- @ApiIgnore
- public void ignoredPUT() {
- ;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/utility/src/test/resources/org/apache/ambari/checkstyle/InputTransactionalOnPrivateMethods.java
----------------------------------------------------------------------
diff --git a/utility/src/test/resources/org/apache/ambari/checkstyle/InputTransactionalOnPrivateMethods.java b/utility/src/test/resources/org/apache/ambari/checkstyle/InputTransactionalOnPrivateMethods.java
deleted file mode 100644
index 2ea5444..0000000
--- a/utility/src/test/resources/org/apache/ambari/checkstyle/InputTransactionalOnPrivateMethods.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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.ambari.checkstyle;
-
-import com.google.inject.persist.Transactional;
-
-/**
- * Input file for AvoidTransactionalOnPrivateMethodsCheckTest.
- */
-public class InputTransactionalOnPrivateMethods {
-
- @Transactional
- public void publicMethodWithTransactional() {
- ;
- }
-
- @Transactional
- private void privateMethodWithTransactional() {
- ;
- }
-
- private void privateMethodWithoutTransactional() {
- ;
- }
-
- @Transactional
- private void otherPrivateMethodWithTransactional() {
- ;
- }
-
-}
[2/2] ambari git commit: AMBARI-21257. Add ambari prefix for utility
and serviceadvisor modules (oleewere)
Posted by ol...@apache.org.
AMBARI-21257. Add ambari prefix for utility and serviceadvisor modules (oleewere)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/1fbb933e
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/1fbb933e
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/1fbb933e
Branch: refs/heads/trunk
Commit: 1fbb933ef91d5a1ccf704e8d043c0ab0f6c30df7
Parents: c52faea
Author: oleewere <ol...@gmail.com>
Authored: Thu Jun 15 15:49:03 2017 +0200
Committer: oleewere <ol...@gmail.com>
Committed: Fri Jun 16 13:10:17 2017 +0200
----------------------------------------------------------------------
ambari-agent/pom.xml | 4 +-
ambari-infra/pom.xml | 4 +-
ambari-logsearch/pom.xml | 4 +-
.../ambari-metrics-timelineservice/pom.xml | 4 +-
ambari-metrics/pom.xml | 10 +-
ambari-project/pom.xml | 4 +-
ambari-server/pom.xml | 10 +-
ambari-serviceadvisor/pom.xml | 124 +++++++++++
.../ambari/serviceadvisor/ServiceAdvisor.java | 147 ++++++++++++
.../ServiceAdvisorCommandType.java | 63 ++++++
ambari-utility/checkstyle.xml | 38 ++++
ambari-utility/pom.xml | 145 ++++++++++++
.../src/main/java/category/AlertTest.java | 27 +++
.../main/java/category/AmbariUpgradeTest.java | 27 +++
.../src/main/java/category/BlueprintTest.java | 27 +++
.../src/main/java/category/FastTest.java | 27 +++
.../src/main/java/category/KerberosTest.java | 27 +++
.../src/main/java/category/MetricsTest.java | 27 +++
.../src/main/java/category/SlowTest.java | 27 +++
.../main/java/category/StackUpgradeTest.java | 27 +++
.../apache/ambari/annotations/ApiIgnore.java | 29 +++
...AvoidTransactionalOnPrivateMethodsCheck.java | 55 +++++
.../UndocumentedRestApiOperationCheck.java | 76 +++++++
.../ambari/swagger/AmbariSwaggerReader.java | 222 +++++++++++++++++++
.../src/main/resources/checkstyle_packages.xml | 15 ++
...dTransactionalOnPrivateMethodsCheckTest.java | 49 ++++
.../UndocumentedRestApiOperationCheckTest.java | 53 +++++
.../ambari/swagger/AmbariSwaggerReaderTest.java | 182 +++++++++++++++
.../src/test/resources/log4j.properties | 19 ++
.../checkstyle/InputRestApiOperation.java | 138 ++++++++++++
.../InputTransactionalOnPrivateMethods.java | 46 ++++
pom.xml | 16 +-
serviceadvisor/pom.xml | 124 -----------
.../ambari/serviceadvisor/ServiceAdvisor.java | 147 ------------
.../ServiceAdvisorCommandType.java | 63 ------
utility/checkstyle.xml | 38 ----
utility/pom.xml | 145 ------------
utility/src/main/java/category/AlertTest.java | 27 ---
.../main/java/category/AmbariUpgradeTest.java | 27 ---
.../src/main/java/category/BlueprintTest.java | 27 ---
utility/src/main/java/category/FastTest.java | 27 ---
.../src/main/java/category/KerberosTest.java | 27 ---
utility/src/main/java/category/MetricsTest.java | 27 ---
utility/src/main/java/category/SlowTest.java | 27 ---
.../main/java/category/StackUpgradeTest.java | 27 ---
.../apache/ambari/annotations/ApiIgnore.java | 29 ---
...AvoidTransactionalOnPrivateMethodsCheck.java | 55 -----
.../UndocumentedRestApiOperationCheck.java | 76 -------
.../ambari/swagger/AmbariSwaggerReader.java | 222 -------------------
.../src/main/resources/checkstyle_packages.xml | 15 --
...dTransactionalOnPrivateMethodsCheckTest.java | 49 ----
.../UndocumentedRestApiOperationCheckTest.java | 53 -----
.../ambari/swagger/AmbariSwaggerReaderTest.java | 182 ---------------
utility/src/test/resources/log4j.properties | 19 --
.../checkstyle/InputRestApiOperation.java | 138 ------------
.../InputTransactionalOnPrivateMethods.java | 46 ----
56 files changed, 1645 insertions(+), 1645 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-agent/pom.xml
----------------------------------------------------------------------
diff --git a/ambari-agent/pom.xml b/ambari-agent/pom.xml
index 7690fcf..f2add9a 100644
--- a/ambari-agent/pom.xml
+++ b/ambari-agent/pom.xml
@@ -103,8 +103,8 @@
<scope>test</scope>
</dependency>
<dependency>
- <groupId>utility</groupId>
- <artifactId>utility</artifactId>
+ <groupId>org.apache.ambari</groupId>
+ <artifactId>ambari-utility</artifactId>
<scope>test</scope>
<version>1.0.0.0-SNAPSHOT</version>
</dependency>
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-infra/pom.xml
----------------------------------------------------------------------
diff --git a/ambari-infra/pom.xml b/ambari-infra/pom.xml
index a5a5b38..07adb3e 100644
--- a/ambari-infra/pom.xml
+++ b/ambari-infra/pom.xml
@@ -178,8 +178,8 @@
<dependencies>
<!-- Dependency in order to annotate unit tests with a category. -->
<dependency>
- <groupId>utility</groupId>
- <artifactId>utility</artifactId>
+ <groupId>org.apache.ambari</groupId>
+ <artifactId>ambari-utility</artifactId>
<version>1.0.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-logsearch/pom.xml
----------------------------------------------------------------------
diff --git a/ambari-logsearch/pom.xml b/ambari-logsearch/pom.xml
index 6f78abe..af1dc6a 100644
--- a/ambari-logsearch/pom.xml
+++ b/ambari-logsearch/pom.xml
@@ -184,8 +184,8 @@
<dependencies>
<!-- Dependency in order to annotate unit tests with a category. -->
<dependency>
- <groupId>utility</groupId>
- <artifactId>utility</artifactId>
+ <groupId>org.apache.ambari</groupId>
+ <artifactId>ambari-utility</artifactId>
<version>1.0.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-metrics/ambari-metrics-timelineservice/pom.xml
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-timelineservice/pom.xml b/ambari-metrics/ambari-metrics-timelineservice/pom.xml
index 3419f16..a5eb572 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/pom.xml
+++ b/ambari-metrics/ambari-metrics-timelineservice/pom.xml
@@ -658,8 +658,8 @@
<!-- Dependency in order to annotate unit tests with a category. -->
<dependency>
- <groupId>utility</groupId>
- <artifactId>utility</artifactId>
+ <groupId>org.apache.ambari</groupId>
+ <artifactId>ambari-utility</artifactId>
<version>1.0.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-metrics/pom.xml
----------------------------------------------------------------------
diff --git a/ambari-metrics/pom.xml b/ambari-metrics/pom.xml
index 02f9574..b585916 100644
--- a/ambari-metrics/pom.xml
+++ b/ambari-metrics/pom.xml
@@ -22,7 +22,7 @@
<version>2.0.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
- <module>../utility</module>
+ <module>../ambari-utility</module>
<module>ambari-metrics-common</module>
<module>ambari-metrics-hadoop-sink</module>
<module>ambari-metrics-flume-sink</module>
@@ -305,8 +305,8 @@
<dependencies>
<!-- Dependency in order to annotate unit tests with a category. -->
<dependency>
- <groupId>utility</groupId>
- <artifactId>utility</artifactId>
+ <groupId>org.apache.ambari</groupId>
+ <artifactId>ambari-utility</artifactId>
<version>1.0.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
@@ -320,8 +320,8 @@
</properties>
<dependencies>
<dependency>
- <groupId>utility</groupId>
- <artifactId>utility</artifactId>
+ <groupId>org.apache.ambari</groupId>
+ <artifactId>ambari-utility</artifactId>
<version>1.0.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-project/pom.xml
----------------------------------------------------------------------
diff --git a/ambari-project/pom.xml b/ambari-project/pom.xml
index b06bd18..7e1b813 100644
--- a/ambari-project/pom.xml
+++ b/ambari-project/pom.xml
@@ -569,8 +569,8 @@
<version>${checkstyle.version}</version>
</dependency>
<dependency>
- <groupId>utility</groupId>
- <artifactId>utility</artifactId>
+ <groupId>org.apache.ambari</groupId>
+ <artifactId>ambari-utility</artifactId>
<version>1.0.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-server/pom.xml
----------------------------------------------------------------------
diff --git a/ambari-server/pom.xml b/ambari-server/pom.xml
index ca3b2da..91c35e5 100644
--- a/ambari-server/pom.xml
+++ b/ambari-server/pom.xml
@@ -1660,17 +1660,17 @@
<artifactId>metrics-jvm</artifactId>
<version>3.1.0</version>
</dependency>
-
+
<dependency>
- <groupId>serviceadvisor</groupId>
- <artifactId>serviceadvisor</artifactId>
+ <groupId>org.apache.ambari</groupId>
+ <artifactId>ambari-serviceadvisor</artifactId>
<version>1.0.0.0-SNAPSHOT</version>
</dependency>
<!-- Dependency in order to annotate unit tests with a category. -->
<dependency>
- <groupId>utility</groupId>
- <artifactId>utility</artifactId>
+ <groupId>org.apache.ambari</groupId>
+ <artifactId>ambari-utility</artifactId>
<version>1.0.0.0-SNAPSHOT</version>
<scope>provided</scope> <!-- for @ApiIgnore -->
</dependency>
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-serviceadvisor/pom.xml
----------------------------------------------------------------------
diff --git a/ambari-serviceadvisor/pom.xml b/ambari-serviceadvisor/pom.xml
new file mode 100644
index 0000000..8719cd8
--- /dev/null
+++ b/ambari-serviceadvisor/pom.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <!-- Can compile this project independently, cd ambari-serviceadvisor ; mvn clean package install
+
+ To test independently without needing the rest of Ambari, simply compile and run as,
+ java -jar ambari-serviceadvisor-$VERSION.jar [ACTION] [HOSTS_FILE.json] [SERVICES_FILE.json]
+ -->
+ <groupId>org.apache.ambari</groupId>
+ <artifactId>ambari-serviceadvisor</artifactId>
+ <name>Ambari Service Advisor</name>
+ <version>1.0.0.0-SNAPSHOT</version>
+ <description>Service Advisor</description>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <version>2.6</version>
+ </dependency>
+
+ <!-- Log Factory logging
+ The main class is expected to write to stdout and stderr appropriately.
+ -->
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <version>1.2</version>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>1.7.20</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-lang3</artifactId>
+ <version>3.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.4</version>
+ </dependency>
+ </dependencies>
+
+ <pluginRepositories>
+ <pluginRepository>
+ <id>oss.sonatype.org</id>
+ <name>OSS Sonatype Staging</name>
+ <url>https://oss.sonatype.org/content/groups/staging</url>
+ </pluginRepository>
+ </pluginRepositories>
+
+ <packaging>jar</packaging>
+ <!-- Run with mvn clean package .
+ Execute as, java -jar serviceadvisor-$VERSION.jar
+ -->
+ <build>
+ <plugins>
+ <!--
+ The next 2 plugins are to include the main class in the Jar and to create a single jar with all of the dependencies.
+ It conflicts with the maven-compiler-plugin since the jar created is different.
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <configuration>
+ <archive>
+ <manifest>
+ <addClasspath>true</addClasspath>
+ <mainClass>org.apache.ambari.stackadvisor.StackAdvisor</mainClass>
+ </manifest>
+ </archive>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-shade-plugin</artifactId>
+ <version>1.6</version>
+ <executions>
+ <execution>
+ <phase>package</phase>
+ <goals>
+ <goal>shade</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ -->
+ <plugin>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.2</version>
+ <configuration>
+ <source>1.7</source>
+ <target>1.7</target>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>rpm-maven-plugin</artifactId>
+ <version>2.0.1</version>
+ <executions>
+ <execution>
+ <!-- unbinds rpm creation from maven lifecycle -->
+ <phase>none</phase>
+ <goals>
+ <goal>rpm</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <copyright>2012, Apache Software Foundation</copyright>
+ <group>Development</group>
+ <disabled>true</disabled>
+ <description>Maven Recipe: RPM Package.</description>
+ <mappings/>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-serviceadvisor/src/main/java/org/apache/ambari/serviceadvisor/ServiceAdvisor.java
----------------------------------------------------------------------
diff --git a/ambari-serviceadvisor/src/main/java/org/apache/ambari/serviceadvisor/ServiceAdvisor.java b/ambari-serviceadvisor/src/main/java/org/apache/ambari/serviceadvisor/ServiceAdvisor.java
new file mode 100644
index 0000000..77c482a
--- /dev/null
+++ b/ambari-serviceadvisor/src/main/java/org/apache/ambari/serviceadvisor/ServiceAdvisor.java
@@ -0,0 +1,147 @@
+/**
+ * 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.ambari.serviceadvisor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.lang3.EnumUtils;
+import org.apache.commons.lang.StringUtils;
+
+/**
+ * Class that can be called either through its jar or using its run method.
+ * The goal is to invoke a Service Advisor.
+ * Right now, it is backward compatible by invoking the python script and does not know which service is affected.
+ */
+public class ServiceAdvisor {
+ protected static Log LOG = LogFactory.getLog(ServiceAdvisor.class);
+
+ private static String USAGE = "Usage: java -jar serviceadvisor.jar [ACTION] [HOSTS_FILE.json] [SERVICES_FILE.json] [OUTPUT.txt] [ERRORS.txt]";
+ private static String PYTHON_STACK_ADVISOR_SCRIPT = "/var/lib/ambari-server/resources/scripts/stack_advisor.py";
+
+ /**
+ * Entry point for calling this class through its jar.
+ * @param args
+ */
+ public static void main(String[] args) {
+ if (args.length != 5) {
+ System.err.println(String.format("Wrong number of arguments. %s", USAGE));
+ System.exit(1);
+ }
+
+ String action = args[0];
+ String hostsFile = args[1];
+ String servicesFile = args[2];
+ String outputFile = args[3];
+ String errorFile = args[4];
+
+ int exitCode = run(action, hostsFile, servicesFile, outputFile, errorFile);
+ System.exit(exitCode);
+ }
+
+ public static int run(String action, String hostsFile, String servicesFile, String outputFile, String errorFile) {
+ LOG.info(String.format("ServiceAdvisor. Received arguments. Action: %s, Hosts File: %s, Services File: %s", action, hostsFile, servicesFile));
+ int returnCode = -1;
+
+ try {
+ ServiceAdvisorCommandType commandType = ServiceAdvisorCommandType.getEnum(action);
+
+ // TODO, load each Service's Service Advisor at Start Time and call it instead of Python command below.
+
+ ProcessBuilder builder = preparePythonShellCommand(commandType, hostsFile, servicesFile, outputFile, errorFile);
+ returnCode = launchProcess(builder);
+ } catch (IllegalArgumentException e) {
+ List<ServiceAdvisorCommandType> values = EnumUtils.getEnumList(ServiceAdvisorCommandType.class);
+ List<String> stringValues = new ArrayList<String>();
+ for (ServiceAdvisorCommandType value : values) {
+ stringValues.add(value.toString());
+ }
+ LOG.error("ServiceAdvisor. Illegal Argument. Action must be one of " + StringUtils.join(stringValues.toArray(), ", "));
+ return -1;
+ } catch (Exception e) {
+ LOG.error("ServiceAdvisor. Failed with " + e.getMessage());
+ return -1;
+ }
+ return returnCode;
+ }
+
+ /**
+ * Generate a process to invoke a Python command for the old-style Stack Advisor.
+ * @param commandType Command Type
+ * @param hostsFile hosts.json file
+ * @param servicesFile services.json file
+ * @param outputFile output.txt
+ * @param errorFile error.txt
+ * @return Process that can launch.
+ */
+ private static ProcessBuilder preparePythonShellCommand(ServiceAdvisorCommandType commandType, String hostsFile, String servicesFile, String outputFile, String errorFile) {
+ List<String> builderParameters = new ArrayList<String>();
+
+ if (System.getProperty("os.name").contains("Windows")) {
+ builderParameters.add("cmd");
+ builderParameters.add("/c");
+ } else {
+ builderParameters.add("sh");
+ builderParameters.add("-c");
+ }
+
+ StringBuilder commandString = new StringBuilder();
+ commandString.append(PYTHON_STACK_ADVISOR_SCRIPT + " ");
+
+ commandString.append(commandType.toString()).append(" ");
+ commandString.append(hostsFile).append(" ");
+ commandString.append(servicesFile).append(" ");
+ commandString.append("1> ");
+ commandString.append(outputFile).append(" ");
+ commandString.append("2>");
+ commandString.append(errorFile).append(" ");
+
+ builderParameters.add(commandString.toString());
+
+ LOG.info("ServiceAdvisor. Python command is: " + builderParameters.toString());
+
+ return new ProcessBuilder(builderParameters);
+ }
+
+ /**
+ * Launch a process, wait for it to finish, and return its exit code.
+ * @param builder Process Builder
+ * @return Exit Code
+ * @throws Exception
+ */
+ private static int launchProcess(ProcessBuilder builder) throws Exception {
+ int exitCode = -1;
+ Process process = null;
+ try {
+ process = builder.start();
+ exitCode = process.waitFor();
+ } catch (Exception ioe) {
+ String message = "Error executing Service Advisor: ";
+ LOG.error(message, ioe);
+ throw new Exception(message + ioe.getMessage());
+ } finally {
+ if (process != null) {
+ process.destroy();
+ }
+ }
+ return exitCode;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-serviceadvisor/src/main/java/org/apache/ambari/serviceadvisor/ServiceAdvisorCommandType.java
----------------------------------------------------------------------
diff --git a/ambari-serviceadvisor/src/main/java/org/apache/ambari/serviceadvisor/ServiceAdvisorCommandType.java b/ambari-serviceadvisor/src/main/java/org/apache/ambari/serviceadvisor/ServiceAdvisorCommandType.java
new file mode 100644
index 0000000..f067668
--- /dev/null
+++ b/ambari-serviceadvisor/src/main/java/org/apache/ambari/serviceadvisor/ServiceAdvisorCommandType.java
@@ -0,0 +1,63 @@
+/**
+ * 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.ambari.serviceadvisor;
+
+
+// TODO, use this class instead of org.apache.ambari.server.api.services.stackadvisor.commands.StackAdvisorCommandType
+public enum ServiceAdvisorCommandType {
+
+ RECOMMEND_COMPONENT_LAYOUT("recommend-component-layout"),
+
+ VALIDATE_COMPONENT_LAYOUT("validate-component-layout"),
+
+ RECOMMEND_CONFIGURATIONS("recommend-configurations"),
+
+ RECOMMEND_CONFIGURATION_DEPENDENCIES("recommend-configuration-dependencies"),
+
+ VALIDATE_CONFIGURATIONS("validate-configurations");
+ private final String name;
+
+ private ServiceAdvisorCommandType(String name) {
+ this.name = name;
+ }
+
+ public String getValue() {
+ return this.name.toLowerCase();
+ }
+
+ @Override
+ public String toString() {
+ return this.name;
+ }
+
+ /**
+ * Instead of Enum.valueOf("value"), use this method instead to map the string to the correct Enum.
+ * @param name Name with lowercase and dashes.
+ * @return Enum that matches the string.
+ */
+ public static ServiceAdvisorCommandType getEnum(String name) {
+ for (ServiceAdvisorCommandType v : values()) {
+ if (v.getValue().equalsIgnoreCase(name.replace("_", "-"))) {
+ return v;
+ }
+ }
+ throw new IllegalArgumentException();
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-utility/checkstyle.xml
----------------------------------------------------------------------
diff --git a/ambari-utility/checkstyle.xml b/ambari-utility/checkstyle.xml
new file mode 100644
index 0000000..2e7d6f0
--- /dev/null
+++ b/ambari-utility/checkstyle.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+<!-- 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.
+ See accompanying LICENSE file. -->
+<!DOCTYPE module PUBLIC
+ "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
+ "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
+<module name="Checker">
+ <module name="TreeWalker">
+ <module name="FallThrough"/>
+
+ <!-- imports -->
+ <module name="AvoidStarImport"/>
+ <module name="IllegalImport"/>
+ <module name="ImportOrder">
+ <property name="groups" value="java,javax,org,com,*"/>
+ <property name="ordered" value="true"/>
+ <property name="separated" value="true"/>
+ <property name="option" value="top"/> <!-- static imports -->
+ <property name="sortStaticImportsAlphabetically" value="true"/>
+ </module>
+ <module name="RedundantImport"/>
+ <module name="UnusedImports"/>
+
+ <!-- blocks -->
+ <module name="AvoidNestedBlocks">
+ <property name="allowInSwitchCase" value="true"/>
+ </module>
+ <module name="EmptyBlock">
+ <property name="option" value="text"/>
+ </module>
+ </module>
+</module>
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-utility/pom.xml
----------------------------------------------------------------------
diff --git a/ambari-utility/pom.xml b/ambari-utility/pom.xml
new file mode 100644
index 0000000..1e86d40
--- /dev/null
+++ b/ambari-utility/pom.xml
@@ -0,0 +1,145 @@
+<?xml version="1.0"?>
+<!--
+ 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.ambari</groupId>
+ <artifactId>ambari-project</artifactId>
+ <version>2.0.0.0-SNAPSHOT</version>
+ <relativePath>../ambari-project</relativePath>
+ </parent>
+
+ <artifactId>ambari-utility</artifactId>
+ <groupId>org.apache.ambari</groupId>
+ <version>1.0.0.0-SNAPSHOT</version>
+
+ <dependencies>
+ <dependency>
+ <groupId>com.github.kongchen</groupId>
+ <artifactId>swagger-maven-plugin</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>compile</scope> <!-- has to be compile-time dependency on junit -->
+ </dependency>
+ <dependency>
+ <groupId>com.puppycrawl.tools</groupId>
+ <artifactId>checkstyle</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.puppycrawl.tools</groupId>
+ <artifactId>checkstyle</artifactId>
+ <type>test-jar</type>
+ <version>${checkstyle.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>19.0</version> <!-- required for checkstyle -->
+ </dependency>
+ <dependency>
+ <groupId>org.easymock</groupId>
+ <artifactId>easymock</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.2</version>
+ <configuration>
+ <source>1.7</source>
+ <target>1.7</target>
+ <useIncrementalCompilation>false</useIncrementalCompilation>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.vafer</groupId>
+ <artifactId>jdeb</artifactId>
+ <version>1.0.1</version>
+ <executions>
+ <execution>
+ <!--Stub execution on direct plugin call - workaround for ambari deb build process-->
+ <id>stub-execution</id>
+ <phase>none</phase>
+ <goals>
+ <goal>jdeb</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <skip>true</skip>
+ <attach>false</attach>
+ <submodules>false</submodules>
+ <controlDir>${project.basedir}/../src/main/package/deb/control</controlDir>
+ </configuration>
+ </plugin>
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <configuration>
+ <descriptors>
+ <descriptor>${project.parent.basedir}/src/main/assemblies/empty.xml</descriptor>
+ </descriptors>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>rpm-maven-plugin</artifactId>
+ <version>2.0.1</version>
+ <executions>
+ <execution>
+ <!-- unbinds rpm creation from maven lifecycle -->
+ <phase>none</phase>
+ <goals>
+ <goal>rpm</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <copyright>2012, Apache Software Foundation</copyright>
+ <group>Development</group>
+ <disabled>true</disabled>
+ <description>Maven Recipe: RPM Package.</description>
+ <mappings/>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-checkstyle-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+</project>
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-utility/src/main/java/category/AlertTest.java
----------------------------------------------------------------------
diff --git a/ambari-utility/src/main/java/category/AlertTest.java b/ambari-utility/src/main/java/category/AlertTest.java
new file mode 100644
index 0000000..b6a20ec
--- /dev/null
+++ b/ambari-utility/src/main/java/category/AlertTest.java
@@ -0,0 +1,27 @@
+/*
+ * 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 category;
+
+/**
+ * Category of unit tests that can be annotated. E.g.,
+ * {@code @Category({ category.AlertTest.class}) }
+ *
+ * A Profile can have csv of categories, in order to run the unit tests like,
+ * mvn clean test -P AlertTests
+ */
+public interface AlertTest {}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-utility/src/main/java/category/AmbariUpgradeTest.java
----------------------------------------------------------------------
diff --git a/ambari-utility/src/main/java/category/AmbariUpgradeTest.java b/ambari-utility/src/main/java/category/AmbariUpgradeTest.java
new file mode 100644
index 0000000..881107a
--- /dev/null
+++ b/ambari-utility/src/main/java/category/AmbariUpgradeTest.java
@@ -0,0 +1,27 @@
+/*
+ * 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 category;
+
+/**
+ * Category of unit tests that can be annotated. E.g.,
+ * {@code @Category({ category.AmbariUpgradeTest.class}) }
+ *
+ * A Profile can have csv of categories, in order to run the unit tests like,
+ * mvn clean test -P AmbariUpgradeTests
+ */
+public interface AmbariUpgradeTest {}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-utility/src/main/java/category/BlueprintTest.java
----------------------------------------------------------------------
diff --git a/ambari-utility/src/main/java/category/BlueprintTest.java b/ambari-utility/src/main/java/category/BlueprintTest.java
new file mode 100644
index 0000000..cb7871d
--- /dev/null
+++ b/ambari-utility/src/main/java/category/BlueprintTest.java
@@ -0,0 +1,27 @@
+/*
+ * 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 category;
+
+/**
+ * Category of unit tests that can be annotated. E.g.,
+ * {@code @Category({ category.BlueprintTest.class}) }
+ *
+ * A Profile can have csv of categories, in order to run the unit tests like,
+ * mvn clean test -P BlueprintTests
+ */
+public interface BlueprintTest {}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-utility/src/main/java/category/FastTest.java
----------------------------------------------------------------------
diff --git a/ambari-utility/src/main/java/category/FastTest.java b/ambari-utility/src/main/java/category/FastTest.java
new file mode 100644
index 0000000..a0abddf
--- /dev/null
+++ b/ambari-utility/src/main/java/category/FastTest.java
@@ -0,0 +1,27 @@
+/*
+ * 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 category;
+
+/**
+ * Category of unit tests that can be annotated. E.g.,
+ * {@code @Category({ category.FastTest.class}) }
+ *
+ * A Profile can have csv of categories, in order to run the unit tests like,
+ * mvn clean test -P FastTests
+ */
+public interface FastTest {}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-utility/src/main/java/category/KerberosTest.java
----------------------------------------------------------------------
diff --git a/ambari-utility/src/main/java/category/KerberosTest.java b/ambari-utility/src/main/java/category/KerberosTest.java
new file mode 100644
index 0000000..f7cebdf
--- /dev/null
+++ b/ambari-utility/src/main/java/category/KerberosTest.java
@@ -0,0 +1,27 @@
+/*
+ * 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 category;
+
+/**
+ * Category of unit tests that can be annotated. E.g.,
+ * {@code @Category({ category.KerberosTest.class}) }
+ *
+ * A Profile can have csv of categories, in order to run the unit tests like,
+ * mvn clean test -P KerberosTests
+ */
+public interface KerberosTest {}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-utility/src/main/java/category/MetricsTest.java
----------------------------------------------------------------------
diff --git a/ambari-utility/src/main/java/category/MetricsTest.java b/ambari-utility/src/main/java/category/MetricsTest.java
new file mode 100644
index 0000000..a352ae2
--- /dev/null
+++ b/ambari-utility/src/main/java/category/MetricsTest.java
@@ -0,0 +1,27 @@
+/*
+ * 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 category;
+
+/**
+ * Category of unit tests that can be annotated. E.g.,
+ * {@code @Category({ category.MetricsTest.class}) }
+ *
+ * A Profile can have csv of categories, in order to run the unit tests like,
+ * mvn clean test -P MetricsTests
+ */
+public interface MetricsTest {}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-utility/src/main/java/category/SlowTest.java
----------------------------------------------------------------------
diff --git a/ambari-utility/src/main/java/category/SlowTest.java b/ambari-utility/src/main/java/category/SlowTest.java
new file mode 100644
index 0000000..c1025a9
--- /dev/null
+++ b/ambari-utility/src/main/java/category/SlowTest.java
@@ -0,0 +1,27 @@
+/*
+ * 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 category;
+
+/**
+ * Category of unit tests that can be annotated. E.g.,
+ * {@code @Category({ category.SlowTest.class}) }
+ *
+ * A Profile can have csv of categories, in order to run the unit tests like,
+ * mvn clean test -P SlowTests
+ */
+public interface SlowTest {}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-utility/src/main/java/category/StackUpgradeTest.java
----------------------------------------------------------------------
diff --git a/ambari-utility/src/main/java/category/StackUpgradeTest.java b/ambari-utility/src/main/java/category/StackUpgradeTest.java
new file mode 100644
index 0000000..20a1723
--- /dev/null
+++ b/ambari-utility/src/main/java/category/StackUpgradeTest.java
@@ -0,0 +1,27 @@
+/*
+ * 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 category;
+
+/**
+ * Category of unit tests that can be annotated. E.g.,
+ * {@code @Category({ category.StackUpgradeTest.class}) }
+ *
+ * A Profile can have csv of categories, in order to run the unit tests like,
+ * mvn clean test -P StackUpgradeTests
+ */
+public interface StackUpgradeTest {}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-utility/src/main/java/org/apache/ambari/annotations/ApiIgnore.java
----------------------------------------------------------------------
diff --git a/ambari-utility/src/main/java/org/apache/ambari/annotations/ApiIgnore.java b/ambari-utility/src/main/java/org/apache/ambari/annotations/ApiIgnore.java
new file mode 100644
index 0000000..d50c2fd
--- /dev/null
+++ b/ambari-utility/src/main/java/org/apache/ambari/annotations/ApiIgnore.java
@@ -0,0 +1,29 @@
+/*
+ * 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.ambari.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.SOURCE)
+@Target({ElementType.METHOD})
+public @interface ApiIgnore {
+ // marker
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-utility/src/main/java/org/apache/ambari/checkstyle/AvoidTransactionalOnPrivateMethodsCheck.java
----------------------------------------------------------------------
diff --git a/ambari-utility/src/main/java/org/apache/ambari/checkstyle/AvoidTransactionalOnPrivateMethodsCheck.java b/ambari-utility/src/main/java/org/apache/ambari/checkstyle/AvoidTransactionalOnPrivateMethodsCheck.java
new file mode 100644
index 0000000..80da103
--- /dev/null
+++ b/ambari-utility/src/main/java/org/apache/ambari/checkstyle/AvoidTransactionalOnPrivateMethodsCheck.java
@@ -0,0 +1,55 @@
+/*
+ * 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.ambari.checkstyle;
+
+import com.puppycrawl.tools.checkstyle.api.AbstractCheck;
+import com.puppycrawl.tools.checkstyle.api.DetailAST;
+import com.puppycrawl.tools.checkstyle.api.TokenTypes;
+
+/**
+ * Detects private methods annotated as <code>Transactional</code>.
+ * See https://github.com/google/guice/wiki/Transactions for why this should be
+ * avoided.
+ */
+public class AvoidTransactionalOnPrivateMethodsCheck extends AbstractCheck {
+
+ private static final String ANNOTATION_NAME = "Transactional";
+ public static final String MSG_TRANSACTIONAL_ON_PRIVATE_METHOD = "@" + ANNOTATION_NAME + " should not be used on private methods";
+
+ @Override
+ public int[] getDefaultTokens() {
+ return new int[] { TokenTypes.METHOD_DEF };
+ }
+
+ @Override
+ public void visitToken(DetailAST ast) {
+ DetailAST modifiers = ast.findFirstToken(TokenTypes.MODIFIERS);
+ if (modifiers.findFirstToken(TokenTypes.LITERAL_PRIVATE) != null) {
+ DetailAST annotation = modifiers.findFirstToken(TokenTypes.ANNOTATION);
+ while (annotation != null) {
+ DetailAST name = annotation.findFirstToken(TokenTypes.IDENT);
+ if (name != null && ANNOTATION_NAME.equals(name.getText())) {
+ log(ast.getLineNo(), MSG_TRANSACTIONAL_ON_PRIVATE_METHOD);
+ break;
+ }
+ annotation = annotation.getNextSibling();
+ }
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-utility/src/main/java/org/apache/ambari/checkstyle/UndocumentedRestApiOperationCheck.java
----------------------------------------------------------------------
diff --git a/ambari-utility/src/main/java/org/apache/ambari/checkstyle/UndocumentedRestApiOperationCheck.java b/ambari-utility/src/main/java/org/apache/ambari/checkstyle/UndocumentedRestApiOperationCheck.java
new file mode 100644
index 0000000..c6347db
--- /dev/null
+++ b/ambari-utility/src/main/java/org/apache/ambari/checkstyle/UndocumentedRestApiOperationCheck.java
@@ -0,0 +1,76 @@
+/*
+ * 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.ambari.checkstyle;
+
+import java.util.Set;
+
+import com.google.common.collect.ImmutableSet;
+import com.puppycrawl.tools.checkstyle.api.AbstractCheck;
+import com.puppycrawl.tools.checkstyle.api.DetailAST;
+import com.puppycrawl.tools.checkstyle.api.TokenTypes;
+import com.puppycrawl.tools.checkstyle.utils.AnnotationUtility;
+
+/**
+ * REST API operations should either be documented, or marked to be ignored.
+ */
+public class UndocumentedRestApiOperationCheck extends AbstractCheck {
+
+ private static final Set<String> API_ANNOTATIONS = ImmutableSet.of("DELETE", "GET", "HEAD", "OPTIONS", "PUT", "POST");
+ private static final String API_OPERATION = "ApiOperation";
+ private static final String API_IGNORE = "ApiIgnore";
+ public static final String MESSAGE = "REST API operation should be documented";
+
+ @Override
+ public int[] getDefaultTokens() {
+ return new int[] { TokenTypes.METHOD_DEF };
+ }
+
+ @Override
+ public void visitToken(DetailAST ast) {
+ if (isApiOperation(ast) && !isDocumentedApiOperation(ast) && !isIgnoredApi(ast)) {
+ log(ast.getLineNo(), MESSAGE);
+ }
+ }
+
+ private static boolean isApiOperation(DetailAST ast) {
+ DetailAST modifiers = ast.findFirstToken(TokenTypes.MODIFIERS);
+ if (modifiers.findFirstToken(TokenTypes.LITERAL_PRIVATE) != null) {
+ return false;
+ }
+
+ DetailAST annotation = modifiers.findFirstToken(TokenTypes.ANNOTATION);
+ while (annotation != null) {
+ DetailAST name = annotation.findFirstToken(TokenTypes.IDENT);
+ if (name != null && API_ANNOTATIONS.contains(name.getText())) {
+ return true;
+ }
+ annotation = annotation.getNextSibling();
+ }
+
+ return false;
+ }
+
+ private static boolean isDocumentedApiOperation(DetailAST ast) {
+ return AnnotationUtility.containsAnnotation(ast, API_OPERATION);
+ }
+
+ private static boolean isIgnoredApi(DetailAST ast) {
+ return AnnotationUtility.containsAnnotation(ast, API_IGNORE);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-utility/src/main/java/org/apache/ambari/swagger/AmbariSwaggerReader.java
----------------------------------------------------------------------
diff --git a/ambari-utility/src/main/java/org/apache/ambari/swagger/AmbariSwaggerReader.java b/ambari-utility/src/main/java/org/apache/ambari/swagger/AmbariSwaggerReader.java
new file mode 100644
index 0000000..e258fc4
--- /dev/null
+++ b/ambari-utility/src/main/java/org/apache/ambari/swagger/AmbariSwaggerReader.java
@@ -0,0 +1,222 @@
+/*
+ * 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.ambari.swagger;
+
+import java.lang.reflect.Method;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.ws.rs.Path;
+
+import org.apache.maven.plugin.logging.Log;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.annotation.AnnotationUtils;
+
+import com.github.kongchen.swagger.docgen.reader.JaxrsReader;
+import com.google.common.base.Function;
+import com.google.common.base.Predicates;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+import io.swagger.annotations.Api;
+import io.swagger.models.Operation;
+import io.swagger.models.Swagger;
+import io.swagger.models.Tag;
+import io.swagger.models.parameters.Parameter;
+import io.swagger.models.parameters.PathParameter;
+
+/**
+ * Customized {@link com.github.kongchen.swagger.docgen.reader.ClassSwaggerReader} implementation to
+ * treat nested API's.
+ */
+public class AmbariSwaggerReader extends JaxrsReader {
+
+ /**
+ * Logger instance.
+ */
+ protected final static Logger logger = LoggerFactory.getLogger(AmbariSwaggerReader.class);
+
+ public AmbariSwaggerReader(Swagger swagger, Log LOG) {
+ super(swagger, LOG);
+ }
+
+ private final Map<Class<?>, NestedApiRecord> nestedAPIs = Maps.newHashMap();
+
+ @Override
+ public Swagger getSwagger() {
+ if (null == this.swagger) {
+ this.swagger = new Swagger();
+ }
+ return this.swagger;
+ }
+
+ /**
+ * Original method is overwritten so that to gather information about top level api - nested api relations
+ */
+ @Override
+ public Swagger read(Set<Class<?>> classes) {
+ // scan for and register nested API classes
+ logger.debug("Looking for nested API's");
+ for (Class<?> cls: classes) {
+ logger.debug("Examining API {}", cls.getSimpleName());
+ for (Method method: cls.getMethods()) {
+ Path methodPath = AnnotationUtils.findAnnotation(method, Path.class);
+ if (null != methodPath) {
+ Class<?> returnType = method.getReturnType();
+ Api nestedApi = AnnotationUtils.findAnnotation(returnType, Api.class);
+ Path nestedApiPath = AnnotationUtils.findAnnotation(returnType, Path.class);
+ logger.debug("Examinig API method {}#{}, path={}, returnType={}", cls.getSimpleName(), method.getName(),
+ nestedApiPath != null ? nestedApiPath.value() : null, returnType.getSimpleName());
+ if (null != nestedApi) {
+ if (null != nestedApiPath) {
+ logger.info("This class exists both as top level and nested API: {}, treating it as top level API",
+ returnType.getName());
+ }
+ else {
+ Path apiPath = AnnotationUtils.findAnnotation(cls, Path.class);
+ String apiPathValue;
+ if (null == apiPath) {
+ logger.warn("Parent api {} also seems to be a nested API. The current version does not support " +
+ "multi-level nesting.");
+ apiPathValue = "";
+ }
+ else {
+ apiPathValue = apiPath.value();
+ }
+ NestedApiRecord nar = new NestedApiRecord(returnType, cls, apiPathValue, method, methodPath.value());
+ if (nestedAPIs.containsKey(returnType)) {
+ logger.warn("{} is a nested API of multiple top level API's. Ignoring top level API {}", returnType, cls);
+ }
+ else {
+ logger.info("Registering nested API: {}", returnType);
+ nestedAPIs.put(returnType, nar);
+ }
+ }
+ }
+ }
+ }
+ }
+ logger.info("Found {} nested API's", nestedAPIs.size());
+ // With all information gathered, call superclass implementation
+ return super.read(classes);
+ }
+
+ /**
+ * Original method is overwritten to handle nested api's properly
+ */
+ @Override
+ protected Swagger read(Class<?> cls, String parentPath,
+ String parentMethod,
+ boolean readHidden,
+ String[] parentConsumes,
+ String[] parentProduces,
+ Map<String, Tag> parentTags,
+ List<Parameter> parentParameters) {
+ NestedApiRecord nestedApiRecord = nestedAPIs.get(cls);
+ if (null != nestedApiRecord) {
+ logger.info("Processing nested API: {}", nestedApiRecord);
+ // Get the path parameters of the parent API method. All methods of the nested API class should include these
+ // parameters.
+ Operation operation = parseMethod(nestedApiRecord.parentMethod);
+ List<Parameter> pathParameters = ImmutableList.copyOf(
+ Collections2.filter(operation.getParameters(), Predicates.instanceOf(PathParameter.class)));
+ logger.info("Will copy path params from parent method: {}",
+ Lists.transform(pathParameters, new ParameterToName()));
+ return super.read(cls,
+ joinPaths(nestedApiRecord.parentApiPath, nestedApiRecord.parentMethodPath, parentPath),
+ parentMethod, readHidden,
+ parentConsumes, parentProduces, parentTags, pathParameters);
+ }
+ else {
+ logger.info("Processing top level API: {}", cls.getSimpleName());
+ return super.read(cls, parentPath, parentMethod, readHidden, parentConsumes, parentProduces, parentTags, parentParameters);
+ }
+ }
+
+ /**
+ * Joins path elements properly with slashes avoiding duplicate slashes.
+ *
+ * @param firstPath the first path element
+ * @param paths optionally other path elements
+ * @return the joined path
+ */
+ static String joinPaths(String firstPath, String... paths) {
+ StringBuilder joined = new StringBuilder(firstPath);
+ for(String path: paths) {
+ if (path.isEmpty()) { /* NOP */ }
+ else if (joined.length() == 0) {
+ joined.append(path);
+ }
+ else if (joined.charAt(joined.length() - 1) == '/') {
+ if (path.startsWith("/")) {
+ joined.append(path.substring(1, path.length()));
+ }
+ else {
+ joined.append(path);
+ }
+ }
+ else {
+ if (path.startsWith("/")) {
+ joined.append(path);
+ }
+ else {
+ joined.append('/').append(path);
+ }
+
+ }
+ }
+ return joined.toString();
+ }
+}
+
+class ParameterToName implements Function<Parameter, String> {
+ public String apply(Parameter input) {
+ return input.getName();
+ }
+}
+
+class NestedApiRecord {
+ final Class<?> nestedApi;
+ final Class<?> parentApi;
+ final String parentApiPath;
+ final Method parentMethod;
+ final String parentMethodPath;
+
+ public NestedApiRecord(Class<?> nestedApi, Class<?> parentApi, String parentApiPath, Method parentMethod, String parentMethodPath) {
+ this.nestedApi = nestedApi;
+ this.parentApi = parentApi;
+ this.parentApiPath = parentApiPath;
+ this.parentMethod = parentMethod;
+ this.parentMethodPath = parentMethodPath;
+ }
+
+ @Override
+ public String toString() {
+ return "NestedApiRecord {" +
+ "nestedApi=" + nestedApi +
+ ", parentApi=" + parentApi +
+ ", parentApiPath='" + parentApiPath + '\'' +
+ ", parentMethod=" + parentMethod +
+ ", parentMethodPath='" + parentMethodPath + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-utility/src/main/resources/checkstyle_packages.xml
----------------------------------------------------------------------
diff --git a/ambari-utility/src/main/resources/checkstyle_packages.xml b/ambari-utility/src/main/resources/checkstyle_packages.xml
new file mode 100644
index 0000000..8cf4a44
--- /dev/null
+++ b/ambari-utility/src/main/resources/checkstyle_packages.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ See accompanying LICENSE file. -->
+<!DOCTYPE checkstyle-packages PUBLIC
+ "-//Puppy Crawl//DTD Package Names 1.0//EN"
+ "http://www.puppycrawl.com/dtds/packages_1_0.dtd">
+<checkstyle-packages>
+ <package name="org.apache.ambari.checkstyle"/>
+</checkstyle-packages>
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-utility/src/test/java/org/apache/ambari/checkstyle/AvoidTransactionalOnPrivateMethodsCheckTest.java
----------------------------------------------------------------------
diff --git a/ambari-utility/src/test/java/org/apache/ambari/checkstyle/AvoidTransactionalOnPrivateMethodsCheckTest.java b/ambari-utility/src/test/java/org/apache/ambari/checkstyle/AvoidTransactionalOnPrivateMethodsCheckTest.java
new file mode 100644
index 0000000..bfdbfa1
--- /dev/null
+++ b/ambari-utility/src/test/java/org/apache/ambari/checkstyle/AvoidTransactionalOnPrivateMethodsCheckTest.java
@@ -0,0 +1,49 @@
+/*
+ * 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.ambari.checkstyle;
+
+import static org.apache.ambari.checkstyle.AvoidTransactionalOnPrivateMethodsCheck.MSG_TRANSACTIONAL_ON_PRIVATE_METHOD;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.junit.Test;
+
+import com.puppycrawl.tools.checkstyle.BaseCheckTestSupport;
+import com.puppycrawl.tools.checkstyle.DefaultConfiguration;
+
+public class AvoidTransactionalOnPrivateMethodsCheckTest extends BaseCheckTestSupport {
+
+ @Override
+ protected String getPath(String filename) throws IOException {
+ return new File("src/test/resources/org/apache/ambari/checkstyle/" + filename)
+ .getCanonicalPath();
+ }
+
+ @Test
+ public void transactionalOnPrivateMethod() throws Exception {
+ final DefaultConfiguration config = createCheckConfig(AvoidTransactionalOnPrivateMethodsCheck.class);
+ final String[] expected = {
+ "32: " + MSG_TRANSACTIONAL_ON_PRIVATE_METHOD,
+ "41: " + MSG_TRANSACTIONAL_ON_PRIVATE_METHOD,
+ };
+
+ verify(config, getPath("InputTransactionalOnPrivateMethods.java"), expected);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-utility/src/test/java/org/apache/ambari/checkstyle/UndocumentedRestApiOperationCheckTest.java
----------------------------------------------------------------------
diff --git a/ambari-utility/src/test/java/org/apache/ambari/checkstyle/UndocumentedRestApiOperationCheckTest.java b/ambari-utility/src/test/java/org/apache/ambari/checkstyle/UndocumentedRestApiOperationCheckTest.java
new file mode 100644
index 0000000..7caf3cf
--- /dev/null
+++ b/ambari-utility/src/test/java/org/apache/ambari/checkstyle/UndocumentedRestApiOperationCheckTest.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.ambari.checkstyle;
+
+import static org.apache.ambari.checkstyle.UndocumentedRestApiOperationCheck.MESSAGE;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.junit.Test;
+
+import com.puppycrawl.tools.checkstyle.BaseCheckTestSupport;
+import com.puppycrawl.tools.checkstyle.DefaultConfiguration;
+
+public class UndocumentedRestApiOperationCheckTest extends BaseCheckTestSupport {
+
+ @Override
+ protected String getPath(String filename) throws IOException {
+ return new File("src/test/resources/org/apache/ambari/checkstyle/" + filename)
+ .getCanonicalPath();
+ }
+
+ @Test
+ public void test() throws Exception {
+ final DefaultConfiguration config = createCheckConfig(UndocumentedRestApiOperationCheck.class);
+ final String[] expected = {
+ "36: " + MESSAGE,
+ "53: " + MESSAGE,
+ "70: " + MESSAGE,
+ "87: " + MESSAGE,
+ "104: " + MESSAGE,
+ "121: " + MESSAGE
+ };
+
+ verify(config, getPath("InputRestApiOperation.java"), expected);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-utility/src/test/java/org/apache/ambari/swagger/AmbariSwaggerReaderTest.java
----------------------------------------------------------------------
diff --git a/ambari-utility/src/test/java/org/apache/ambari/swagger/AmbariSwaggerReaderTest.java b/ambari-utility/src/test/java/org/apache/ambari/swagger/AmbariSwaggerReaderTest.java
new file mode 100644
index 0000000..a102152
--- /dev/null
+++ b/ambari-utility/src/test/java/org/apache/ambari/swagger/AmbariSwaggerReaderTest.java
@@ -0,0 +1,182 @@
+/*
+ * 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.ambari.swagger;
+
+import static org.easymock.EasyMock.createMock;
+import static org.junit.Assert.assertEquals ;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+
+import org.apache.commons.collections.set.ListOrderedSet;
+import org.apache.maven.plugin.logging.Log;
+import org.junit.Test;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.models.Response;
+import io.swagger.models.Swagger;
+import io.swagger.models.parameters.Parameter;
+import io.swagger.models.parameters.PathParameter;
+
+public class AmbariSwaggerReaderTest {
+
+
+ /**
+ * Test the {@link AmbariSwaggerReader#joinPaths(String, String...)} method
+ */
+ @Test
+ public void testJoinPaths() {
+ assertEquals("/toplevel/nested/{param}/list",
+ AmbariSwaggerReader.joinPaths("", "/", "/", "", "toplevel", "/nested/", "/{param}", "list"));
+ assertEquals("/toplevel/nested/{param}/list",
+ AmbariSwaggerReader.joinPaths("/", "toplevel", "", "/nested/", "/", "/{param}", "list", ""));
+ }
+
+ /**
+ * Test the basic case: one top level API and one nested API, each with one operation
+ */
+ @Test
+ public void swaggerBasicCase() {
+ AmbariSwaggerReader asr = new AmbariSwaggerReader(null, createMock(Log.class));
+ Swagger swagger = asr.read(ImmutableSet.of(TopLevelAPI.class, NestedAPI.class));
+ assertEquals(ImmutableSet.of("/toplevel/top", "/toplevel/{param}/nested/list"),
+ swagger.getPaths().keySet());
+ assertPathParamsExist(swagger, "/toplevel/{param}/nested/list", "param");
+ }
+
+ /**
+ * Test conflicting nested API's (the same API's are returned from different top level API's).
+ * In this case the nested API should be associated to the first processed top level API.
+ */
+ @Test
+ public void swaggerConflictingNestedApis() {
+ AmbariSwaggerReader asr = new AmbariSwaggerReader(null, createMock(Log.class));
+ ListOrderedSet classes = ListOrderedSet.decorate(
+ Lists.newArrayList(TopLevelAPI.class, AnotherTopLevelAPI.class, NestedAPI.class));
+ Swagger swagger = asr.read(classes);
+ assertEquals(
+ ImmutableSet.of("/toplevel/top", "/toplevel/{param}/nested/list", "/toplevel2/anotherTop"),
+ swagger.getPaths().keySet());
+ assertPathParamsExist(swagger, "/toplevel/{param}/nested/list", "param");
+ }
+
+ /**
+ * If an API is both top level (the class has a @Path annotation) and nested (class is a return type of an
+ * API operation) then it should be treated as top level.
+ */
+ @Test
+ public void swaggerApiThatIsBothTopLevelAndNestedIsCountedAsTopLevel() {
+ AmbariSwaggerReader asr = new AmbariSwaggerReader(null, createMock(Log.class));
+ Swagger swagger = asr.read(ImmutableSet.of(YetAnotherTopLevelAPI.class, NestedAndTopLevelAPI.class));
+ assertEquals(ImmutableSet.of("/toplevel3/yetAnotherTop", "/canBeReachedFromTopToo/list"),
+ swagger.getPaths().keySet());
+ }
+
+
+ /**
+ * Verify that the top level API's path parameters are transferred to the nested API.
+ */
+ private static void assertPathParamsExist(Swagger swagger, String path, String... expectedPathParams) {
+ List<Parameter> parameters = swagger.getPath(path).getGet().getParameters();
+ assertNotNull("No path parameters for path: " + path, parameters);
+ Set<String> pathParamNames = new HashSet<>();
+ for (Parameter param: parameters) {
+ if (param instanceof PathParameter) {
+ pathParamNames.add(param.getName());
+ }
+ }
+ Set<String> missingPathParams = Sets.difference(ImmutableSet.copyOf(expectedPathParams), pathParamNames);
+ assertTrue("Expected path params for [" + path + "] are missing: " + missingPathParams, missingPathParams.isEmpty());
+ }
+
+}
+
+@Path("/toplevel")
+@Api(value = "Top Level", description = "A top level API")
+abstract class TopLevelAPI {
+
+ @GET
+ @Path("/top")
+ @ApiOperation(value = "list")
+ public abstract Response getList();
+
+ @Path("{param}/nested")
+ public abstract NestedAPI getNested(@ApiParam @PathParam(value = "param") String param);
+}
+
+@Path("/toplevel2")
+@Api(value = "Top Level 2", description = "Another top level API")
+abstract class AnotherTopLevelAPI {
+
+ @GET
+ @Path("/anotherTop")
+ @ApiOperation(value = "list")
+ public abstract Response getList();
+
+ @Path("{param}/anotherNested")
+ public abstract NestedAPI getSecondNested(@ApiParam @PathParam(value = "param") String param);
+
+}
+
+@Path("/toplevel3")
+@Api(value = "Top Level 3", description = "Yet another top level API")
+abstract class YetAnotherTopLevelAPI {
+
+ @GET
+ @Path("/yetAnotherTop")
+ @ApiOperation(value = "list")
+ public abstract Response getList();
+
+ @Path("{param}/nested")
+ public abstract NestedAPI getFirstNested(@ApiParam @PathParam(value = "param") String param);
+
+}
+
+@Api(value = "Nested", description = "A nested API")
+abstract class NestedAPI {
+
+ @GET
+ @Path("/list")
+ @ApiOperation(value = "list")
+ public abstract Response getList();
+
+}
+
+@Path("/canBeReachedFromTopToo")
+@Api(value = "Nested and Top Level", description = "An API that is both nested and top level")
+abstract class NestedAndTopLevelAPI {
+
+ @GET
+ @Path("/list")
+ @ApiOperation(value = "list")
+ public abstract Response getList();
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-utility/src/test/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/ambari-utility/src/test/resources/log4j.properties b/ambari-utility/src/test/resources/log4j.properties
new file mode 100644
index 0000000..c088bb7
--- /dev/null
+++ b/ambari-utility/src/test/resources/log4j.properties
@@ -0,0 +1,19 @@
+# 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.
+
+# log4j configuration used during build and unit tests
+
+log4j.rootLogger=INFO,stdout
+log4j.threshold=ALL
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c{2} (%F:%M(%L)) - %m%n
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-utility/src/test/resources/org/apache/ambari/checkstyle/InputRestApiOperation.java
----------------------------------------------------------------------
diff --git a/ambari-utility/src/test/resources/org/apache/ambari/checkstyle/InputRestApiOperation.java b/ambari-utility/src/test/resources/org/apache/ambari/checkstyle/InputRestApiOperation.java
new file mode 100644
index 0000000..9aa35ba
--- /dev/null
+++ b/ambari-utility/src/test/resources/org/apache/ambari/checkstyle/InputRestApiOperation.java
@@ -0,0 +1,138 @@
+/*
+ * 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.ambari.checkstyle;
+
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.HEAD;
+import javax.ws.rs.OPTIONS;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+
+import io.swagger.annotations.ApiOperation;
+
+import org.apache.ambari.annotations.ApiIgnore;
+
+/**
+ * Input file for UndocumentedRestApiOperationCheck.
+ */
+public class InputRestApiOperation {
+
+ @DELETE
+ public void undocumentedDELETE() {
+ ;
+ }
+
+ @DELETE
+ @ApiOperation(value = "...")
+ public void documentedDELETE() {
+ ;
+ }
+
+ @DELETE
+ @ApiIgnore
+ public void ignoredDELETE() {
+ ;
+ }
+
+ @HEAD
+ public void undocumentedHEAD() {
+ ;
+ }
+
+ @HEAD
+ @ApiOperation(value = "...")
+ public void documentedHEAD() {
+ ;
+ }
+
+ @HEAD
+ @ApiIgnore
+ public void ignoredHEAD() {
+ ;
+ }
+
+ @GET
+ public void undocumentedGET() {
+ ;
+ }
+
+ @GET
+ @ApiOperation(value = "...")
+ public void documentedGET() {
+ ;
+ }
+
+ @GET
+ @ApiIgnore
+ public void ignoredGET() {
+ ;
+ }
+
+ @OPTIONS
+ public void undocumentedOPTIONS() {
+ ;
+ }
+
+ @OPTIONS
+ @ApiOperation(value = "...")
+ public void documentedOPTIONS() {
+ ;
+ }
+
+ @OPTIONS
+ @ApiIgnore
+ public void ignoredOPTIONS() {
+ ;
+ }
+
+ @POST
+ public void undocumentedPOST() {
+ ;
+ }
+
+ @POST
+ @ApiOperation(value = "...")
+ public void documentedPOST() {
+ ;
+ }
+
+ @POST
+ @ApiIgnore
+ public void ignoredPOST() {
+ ;
+ }
+
+ @PUT
+ public void undocumentedPUT() {
+ ;
+ }
+
+ @PUT
+ @ApiOperation(value = "...")
+ public void documentedPUT() {
+ ;
+ }
+
+ @PUT
+ @ApiIgnore
+ public void ignoredPUT() {
+ ;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/ambari-utility/src/test/resources/org/apache/ambari/checkstyle/InputTransactionalOnPrivateMethods.java
----------------------------------------------------------------------
diff --git a/ambari-utility/src/test/resources/org/apache/ambari/checkstyle/InputTransactionalOnPrivateMethods.java b/ambari-utility/src/test/resources/org/apache/ambari/checkstyle/InputTransactionalOnPrivateMethods.java
new file mode 100644
index 0000000..2ea5444
--- /dev/null
+++ b/ambari-utility/src/test/resources/org/apache/ambari/checkstyle/InputTransactionalOnPrivateMethods.java
@@ -0,0 +1,46 @@
+/*
+ * 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.ambari.checkstyle;
+
+import com.google.inject.persist.Transactional;
+
+/**
+ * Input file for AvoidTransactionalOnPrivateMethodsCheckTest.
+ */
+public class InputTransactionalOnPrivateMethods {
+
+ @Transactional
+ public void publicMethodWithTransactional() {
+ ;
+ }
+
+ @Transactional
+ private void privateMethodWithTransactional() {
+ ;
+ }
+
+ private void privateMethodWithoutTransactional() {
+ ;
+ }
+
+ @Transactional
+ private void otherPrivateMethodWithTransactional() {
+ ;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 4e27ca6..a5aca94 100644
--- a/pom.xml
+++ b/pom.xml
@@ -402,7 +402,7 @@
<!-- generated DDL-->
<exclude>**/createDDL.jdbc</exclude>
<exclude>**/yarn.lock</exclude>
- <exclude>utility/target/**</exclude>
+ <exclude>ambari-utility/target/**</exclude>
</excludes>
</configuration>
<executions>
@@ -459,7 +459,7 @@
</property>
</activation>
<modules>
- <module>serviceadvisor</module>
+ <module>ambari-serviceadvisor</module>
<module>ambari-web</module>
<module>ambari-project</module>
<module>ambari-views</module>
@@ -483,7 +483,7 @@
</property>
</activation>
<modules>
- <module>serviceadvisor</module>
+ <module>ambari-serviceadvisor</module>
<module>ambari-web</module>
<module>ambari-project</module>
<module>ambari-views</module>
@@ -511,7 +511,7 @@
<module>ambari-shell</module>
<module>ambari-logsearch</module>
<module>ambari-infra</module>
- <module>serviceadvisor</module>
+ <module>ambari-serviceadvisor</module>
</modules>
</profile>
<profile>
@@ -534,7 +534,7 @@
<module>ambari-shell</module>
<module>ambari-logsearch</module>
<module>ambari-infra</module>
- <module>serviceadvisor</module>
+ <module>ambari-serviceadvisor</module>
</modules>
</profile>
<profile>
@@ -544,9 +544,9 @@
</modules>
</profile>
<profile>
- <id>serviceadvisor</id>
+ <id>ambari-serviceadvisor</id>
<modules>
- <module>serviceadvisor</module>
+ <module>ambari-serviceadvisor</module>
</modules>
</profile>
<profile>
@@ -557,7 +557,7 @@
</os>
</activation>
<modules>
- <module>serviceadvisor</module>
+ <module>ambari-serviceadvisor</module>
<module>ambari-web</module>
<module>ambari-project</module>
<module>ambari-views</module>
http://git-wip-us.apache.org/repos/asf/ambari/blob/1fbb933e/serviceadvisor/pom.xml
----------------------------------------------------------------------
diff --git a/serviceadvisor/pom.xml b/serviceadvisor/pom.xml
deleted file mode 100644
index 7a68a09..0000000
--- a/serviceadvisor/pom.xml
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <!-- Can compile this project independently, cd serviceadvisor ; mvn clean package install
-
- To test independently without needing the rest of Ambari, simply compile and run as,
- java -jar serviceadvisor-$VERSION.jar [ACTION] [HOSTS_FILE.json] [SERVICES_FILE.json]
- -->
- <groupId>serviceadvisor</groupId>
- <artifactId>serviceadvisor</artifactId>
- <name>Service Advisor</name>
- <version>1.0.0.0-SNAPSHOT</version>
- <description>Service Advisor</description>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-assembly-plugin</artifactId>
- <version>2.6</version>
- </dependency>
-
- <!-- Log Factory logging
- The main class is expected to write to stdout and stderr appropriately.
- -->
- <dependency>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- <version>1.2</version>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- <version>1.7.20</version>
- </dependency>
- <dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-lang3</artifactId>
- <version>3.0</version>
- </dependency>
-
- <dependency>
- <groupId>commons-lang</groupId>
- <artifactId>commons-lang</artifactId>
- <version>2.4</version>
- </dependency>
- </dependencies>
-
- <pluginRepositories>
- <pluginRepository>
- <id>oss.sonatype.org</id>
- <name>OSS Sonatype Staging</name>
- <url>https://oss.sonatype.org/content/groups/staging</url>
- </pluginRepository>
- </pluginRepositories>
-
- <packaging>jar</packaging>
- <!-- Run with mvn clean package .
- Execute as, java -jar serviceadvisor-$VERSION.jar
- -->
- <build>
- <plugins>
- <!--
- The next 2 plugins are to include the main class in the Jar and to create a single jar with all of the dependencies.
- It conflicts with the maven-compiler-plugin since the jar created is different.
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- <configuration>
- <archive>
- <manifest>
- <addClasspath>true</addClasspath>
- <mainClass>org.apache.ambari.stackadvisor.StackAdvisor</mainClass>
- </manifest>
- </archive>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-shade-plugin</artifactId>
- <version>1.6</version>
- <executions>
- <execution>
- <phase>package</phase>
- <goals>
- <goal>shade</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- -->
- <plugin>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.2</version>
- <configuration>
- <source>1.7</source>
- <target>1.7</target>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>rpm-maven-plugin</artifactId>
- <version>2.0.1</version>
- <executions>
- <execution>
- <!-- unbinds rpm creation from maven lifecycle -->
- <phase>none</phase>
- <goals>
- <goal>rpm</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <copyright>2012, Apache Software Foundation</copyright>
- <group>Development</group>
- <disabled>true</disabled>
- <description>Maven Recipe: RPM Package.</description>
- <mappings/>
- </configuration>
- </plugin>
- </plugins>
- </build>
-</project>