Java tutorial
/** * Copyright (C) 2012 skymobi LTD * * Licensed under GNU GENERAL PUBLIC LICENSE Version 3 (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.gnu.org/licenses/gpl-3.0.html * * 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.appleframework.monitor.model; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.mongodb.Mongo; import com.mongodb.MongoURI; import org.apache.commons.beanutils.BeanPropertyValueEqualsPredicate; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.annotation.Id; import org.springframework.data.authentication.UserCredentials; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.SimpleMongoDbFactory; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.query.BasicQuery; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import java.util.*; /** * config of project,such as :charts,alerts,tasks,metrics etc. * * @author hill.hu */ @SuppressWarnings("deprecation") @Document public class Project { private static Logger logger = LoggerFactory.getLogger(Project.class); private final static Map<String, Mongo> MONGO_MAP = Maps.newHashMap(); @Id private String name; private String alias; private String desc; /** * mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]] */ private String mongoUri; /** * @see com.appleframework.monitor.model.Project#chartViews */ @Deprecated private List<Chart> charts = Lists.newArrayList(); private List<Task> tasks = Lists.newArrayList(); private List<MetricDog> metricDogs = Lists.newArrayList(); private List<String> admins = Lists.newArrayList(); private String metricCollection; private String logCollection; private TimeRange timeRange = TimeRange.lastDay(); private String mailList; private Properties properties = new Properties(); /** * * * @see #chartViews */ private Map<String, String> views = new HashMap<String, String>(); /** * */ private List<ChartView> chartViews = Lists.newArrayList(); private Status status = Status.FINE; private Date createTime = new Date(); public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<ChartView> getChartViews() { return chartViews; } public void setChartViews(List<ChartView> chartViews) { this.chartViews = chartViews; } public String getAlias() { if (alias == null) alias = name; return alias; } public void setAlias(String alias) { this.alias = alias; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public List<Task> getTasks() { return tasks; } public void setTasks(List<Task> tasks) { this.tasks = tasks; } public Task findTask(String taskName) { for (Task task : tasks) { if (taskName.equals(task.getName())) return task; } return null; } public void saveTask(Task task) { Task oldTask = findTask(task.getName()); if (oldTask == null) { tasks.add(task); } else { for (int i = 0; i < tasks.size(); i++) { if (StringUtils.equals(tasks.get(i).getName(), task.getName())) { tasks.set(i, task); } } } } public Task removeTask(String taskName) { for (int i = 0; i < tasks.size(); i++) { Task task = tasks.get(i); if (StringUtils.equals(task.getName(), taskName)) { tasks.remove(i); return task; } } return null; } @SuppressWarnings("rawtypes") public List getCharts() { return charts; } @SuppressWarnings({ "rawtypes", "unchecked" }) public void setCharts(List charts) { this.charts = charts; } public List<MetricDog> getMetricDogs() { return metricDogs; } public void setMetricDogs(List<MetricDog> metricDogs) { this.metricDogs = metricDogs; } public Map<String, String> getViews() { return views; } public void setViews(Map<String, String> views) { this.views = views; } public List<String> getAdmins() { return admins; } public void setAdmins(List<String> admins) { this.admins = admins; } public String getMetricCollection() { if (metricCollection == null) metricCollection = name + "_metrics"; return metricCollection; } public void setMetricCollection(String metricCollection) { this.metricCollection = metricCollection; } public TimeRange getTimeRange() { return timeRange; } public void setTimeRange(TimeRange timeRange) { this.timeRange = timeRange; } public String getMongoUri() { return mongoUri; } public void setMongoUri(String mongoUri) { this.mongoUri = mongoUri; } public MongoTemplate fetchMongoTemplate() { try { Mongo mongo; if (MONGO_MAP.containsKey(mongoUri)) { mongo = MONGO_MAP.get(mongoUri); } else { mongo = new Mongo(new MongoURI(mongoUri)); MONGO_MAP.put(mongoUri, mongo); } MongoURI uri = new MongoURI(mongoUri); return new MongoTemplate(new SimpleMongoDbFactory(mongo, uri.getDatabase(), new UserCredentials(uri.getUsername(), parseChars(uri.getPassword())))); } catch (Exception e) { logger.error("mongo db error ,uri={}", mongoUri, e); return null; } } private static String parseChars(char[] chars) { return chars == null ? null : String.valueOf(chars); } @SuppressWarnings({ "unchecked", "rawtypes" }) public List<String> findMetricNames() { try { List list = fetchMongoTemplate().getCollection(metricCollection).distinct("name"); logger.debug("project [{}] has metrics ={} ,mongo={}", new Object[] { name, list, mongoUri }); return list; } catch (Exception e) { logger.error("load metrics fail projectName=" + name, e); } return Lists.newArrayList(); } private Query fetchTimeQuery() { return new Query(Criteria.where(Constants.TIME_STAMP_FIELD_NAME).gt(timeRange.getStart().getTime())); } public List<MetricValue> findMetricData(String metricName) { Query query = fetchTimeQuery(); query.addCriteria(Criteria.where("name").is(metricName)); //query.sort().on(Constants.TIME_STAMP_FIELD_NAME, Order.ASCENDING); query.with(new Sort(Direction.ASC, Constants.TIME_STAMP_FIELD_NAME)); logger.debug("find metric value by {} ,mongo={}", query.getQueryObject(), mongoUri); return fetchMongoTemplate().find(query, MetricValue.class, metricCollection); } /** * * * @param metricName * @return */ public MetricValue findLastMetric(String metricName) { Query query = BasicQuery.query(Criteria.where("name").is(metricName)); //query.sort().on(Constants.TIME_STAMP_FIELD_NAME, Order.DESCENDING); query.with(new Sort(Direction.DESC, Constants.TIME_STAMP_FIELD_NAME)); return fetchMongoTemplate().findOne(query, MetricValue.class, metricCollection); } public void saveDog(MetricDog metricDog) { removeDog(metricDog.getName()); metricDogs.add(metricDog); } public MetricDog findDog(String dogName) { return (MetricDog) CollectionUtils.find(metricDogs, new BeanPropertyValueEqualsPredicate("name", dogName)); } public void removeDog(String dogName) { for (int i = 0; i < metricDogs.size(); i++) { if (metricDogs.get(i).getName().equals(dogName)) { logger.debug("delete dog [{}] from [{}]", dogName, name); metricDogs.remove(i); return; } } logger.warn("delete fail,can't find dog [{}] from [{}]", dogName, name); } public String getMailList() { return mailList; } public void setMailList(String mailList) { this.mailList = mailList; } @Override public String toString() { return "Project{" + "name='" + name + '\'' + ", alias='" + alias + '\'' + ", desc='" + desc + '\'' + ", mongoUri='" + mongoUri + '\'' + ", metricDogs=" + metricDogs + ", metricCollection='" + metricCollection + '\'' + ", timeRange=" + timeRange + ", mailList='" + mailList + '\'' + ", taskCount='" + tasks.size() + '\'' + '}'; } public boolean hasMember(String userName) { return admins != null && admins.contains(userName); } public String getLogCollection() { return logCollection; } public void setLogCollection(String logCollection) { this.logCollection = logCollection; } public Properties getProperties() { return properties; } public void setProperties(Properties properties) { this.properties = properties; } public void setStatus(Status status) { this.status = status; } public Status getStatus() { return status; } }