/**
* 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.falcon.resource.admin;
import org.apache.commons.lang.StringUtils;
import org.apache.falcon.util.BuildProperties;
import org.apache.falcon.util.DeploymentProperties;
import org.apache.falcon.util.RuntimeProperties;
import org.apache.falcon.util.StartupProperties;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
/**
* Jersey Resource for admin operations.
*/
@Path("admin")
public class AdminResource {
@GET
@Path("stack")
@Produces(MediaType.TEXT_PLAIN)
public String getThreadDump() {
ThreadGroup topThreadGroup = Thread.currentThread().getThreadGroup();
while (topThreadGroup.getParent() != null) {
topThreadGroup = topThreadGroup.getParent();
}
Thread[] threads = new Thread[topThreadGroup.activeCount()];
int nr = topThreadGroup.enumerate(threads);
StringBuilder builder = new StringBuilder();
for (int i = 0; i < nr; i++) {
builder.append(threads[i].getName()).append("\nState: ").
append(threads[i].getState()).append("\n");
String stackTrace = StringUtils.join(threads[i].getStackTrace(), "\n");
builder.append(stackTrace);
}
return builder.toString();
}
private PropertyList version;
@GET
@Path("version")
@Produces({MediaType.TEXT_XML, MediaType.APPLICATION_JSON})
public PropertyList getVersion() {
if (version == null) {
List<Property> props = new ArrayList<Property>();
Property property = new Property();
property.key = "Version";
property.value = BuildProperties.get().getProperty("build.version");
props.add(property);
property = new Property();
property.key = "Mode";
property.value = DeploymentProperties.get().getProperty("deploy.mode");
props.add(property);
version = new PropertyList();
version.properties = props;
}
return version;
}
@GET
@Path("config/{type}")
@Produces({MediaType.TEXT_XML, MediaType.APPLICATION_JSON})
public PropertyList getVersion(@PathParam("type") String type) {
if ("build".equals(type)) {
return getProperties(BuildProperties.get());
} else if ("deploy".equals(type)) {
return getProperties(DeploymentProperties.get());
} else if ("startup".equals(type)) {
return getProperties(StartupProperties.get());
} else if ("runtime".equals(type)) {
return getProperties(RuntimeProperties.get());
} else {
return null;
}
}
private PropertyList getProperties(Properties properties) {
List<Property> props = new ArrayList<Property>();
for (Object key : properties.keySet()) {
Property property = new Property();
property.key = key.toString();
property.value = properties.getProperty(key.toString());
props.add(property);
}
PropertyList propertyList = new PropertyList();
propertyList.properties = props;
return propertyList;
}
//SUSPEND CHECKSTYLE CHECK VisibilityModifierCheck
@XmlRootElement(name = "property")
@XmlAccessorType(XmlAccessType.FIELD)
@edu.umd.cs.findbugs.annotations.SuppressWarnings({"URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD"})
private static class Property {
public String key;
public String value;
}
//RESUME CHECKSTYLE CHECK VisibilityModifierCheck
//SUSPEND CHECKSTYLE CHECK VisibilityModifierCheck
@XmlRootElement(name = "properties")
@XmlAccessorType(XmlAccessType.FIELD)
@edu.umd.cs.findbugs.annotations.SuppressWarnings({"URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD"})
private static class PropertyList {
public List<Property> properties;
}
//RESUME CHECKSTYLE CHECK VisibilityModifierCheck
}