/**
* Copyright (C) 2011 - 101loops.com <dev@101loops.com>
*
* 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.
*/
package com.crashnote.core.collect.impl;
import com.crashnote.core.collect.BaseCollector;
import com.crashnote.core.config.*;
import com.crashnote.core.model.data.DataObject;
/**
* Collector to transform an application's environment data (e.g. version, system hardware etc.)
* into a structured form.
*/
public class EnvCollector<C extends Config>
extends BaseCollector<C> implements IConfigChangeListener<C> {
// configuration settings:
private String profile;
private Long startTime;
private String appVersion;
private String clientSignature;
private String[] environmentFilters;
// SETUP ======================================================================================
public EnvCollector(final C config) {
super(config);
updateConfig(config);
}
public void updateConfig(final C config) {
config.addListener(this);
this.profile = config.getAppProfile();
this.appVersion = config.getAppVersion();
this.startTime = config.getStartTime();
this.clientSignature = config.getClientInfo();
this.environmentFilters = config.getEnvironmentFilters();
}
// INTERFACE ==================================================================================
public final DataObject collect() {
final DataObject data = createDataObj();
{
data.put("start", startTime);
data.putObj("app", getAppData());
data.putObj("rt", getRtData());
data.putObj("sys", getSysData());
data.putObj("dev", getDevData());
}
return data;
}
// SHARED =====================================================================================
protected DataObject getAppData() {
final DataObject appData = createDataObj();
{
appData.put("lang", "java");
appData.put("ver", appVersion);
appData.put("prof", profile);
appData.put("client", this.clientSignature);
}
return appData;
}
protected DataObject getRtData() {
final DataObject rtData = createDataObj();
{
rtData.put("type", "jvm");
rtData.put("name", getSysUtil().getRuntimeName());
rtData.put("ver", getSysUtil().getRuntimeVersion());
// properties
final DataObject props = createDataObj();
{
for (final Object key : getSysUtil().getPropertyKeys()) {
final String name = key.toString();
final String value = getSysUtil().getProperty(name);
if (!ignoreProperty(name, value)) props.put(name, value);
}
}
rtData.put("props", props);
}
return rtData;
}
protected DataObject getSysData() {
final DataObject sysData = createDataObj();
{
// identity
sysData.put("id", getSysUtil().getSystemID());
sysData.put("ip", getSysUtil().getHostAddress());
sysData.put("name", getSysUtil().getHostName());
// settings
sysData.put("tz", getSysUtil().getTimezoneID());
sysData.put("toff", getSysUtil().getTimezoneOffset());
sysData.put("lang", getSysUtil().getLanguage());
// OS
sysData.put("os.n", getSysUtil().getOSName());
sysData.put("os.v", getSysUtil().getOSVersion());
// environment properties
final DataObject props = createDataObj();
{
for (final String name : getSysUtil().getEnvKeys())
props.put(name, isFiltered(name) ? "#" : getSysUtil().getEnv(name));
}
sysData.put("props", props);
}
return sysData;
}
protected DataObject getDevData() {
final DataObject devData = createDataObj();
{
// CPU
devData.put("cores", getSysUtil().getAvailableProcessors());
// RAM
devData.put("ram", getSysUtil().getTotalMemorySize());
devData.put("ram.free", getSysUtil().getAvailableMemorySize());
}
return devData;
}
// INTERNALS ==================================================================================
private boolean ignoreProperty(final String name, final String value) {
return value.length() > 255
|| name.startsWith("java.")
|| name.startsWith("user.")
|| name.startsWith("os.")
|| name.startsWith("awt.")
|| name.startsWith("jna.")
|| name.startsWith("file.")
|| name.startsWith("sun.")
|| name.endsWith(".separator");
}
private boolean isFiltered(final String name) {
for (final String filter : environmentFilters)
if (name.matches(filter)) return true;
return false;
}
}