/** * Copyright 2013-2014 Recruit Technologies Co., Ltd. and contributors * (see CONTRIBUTORS.md) * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. A copy of the * License is distributed with this work in the LICENSE.md file. You may * also obtain a copy of the License from * * 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.gennai.gungnir.topology; import static org.gennai.gungnir.GungnirConfig.*; import static org.gennai.gungnir.GungnirConst.*; import java.io.Serializable; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.gennai.gungnir.GungnirConfig; import org.gennai.gungnir.log.DebugLogger; import org.gennai.gungnir.topology.component.GungnirComponent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.net.SocketAppender; import ch.qos.logback.core.status.Status; import ch.qos.logback.core.status.StatusListener; public class GungnirContext implements Serializable { private static final long serialVersionUID = SERIAL_VERSION_UID; private static final Logger LOG = LoggerFactory.getLogger(GungnirContext.class); private static final String TOPOLOGY_ID = "TOPOLOGY_ID"; private static final String ACCOUNT_ID = "ACCOUNT_ID"; private static final String TASK_INDEX = "TASK_INDEX"; private static final String TASK_ID = "TASK_ID"; private static final Pattern VARIABLE_PATTERN = Pattern.compile("\\$\\{(.+?)\\}"); private String topologyId; private String topologyName; private String accountId; private Map<String, Map<String, List<String>>> outputFields; private Map<String, GroupFields> groupFields; private GungnirComponent component; private static DebugLogger DEBUG_LOG; public void setTopologyId(String topologyId) { this.topologyId = topologyId; } public String getTopologyId() { return topologyId; } public void setTopologyName(String topologyName) { this.topologyName = topologyName; } public String getTopologyName() { return topologyName; } public void setAccountId(String accountId) { this.accountId = accountId; } public String getAccountId() { return accountId; } public void setOutputFields(Map<String, Map<String, List<String>>> outputFields) { this.outputFields = outputFields; } public Map<String, Map<String, List<String>>> getOutputFields() { return outputFields; } public void setGroupFields(Map<String, GroupFields> groupFields) { this.groupFields = groupFields; } public Map<String, GroupFields> getGroupFields() { return groupFields; } public synchronized DebugLogger getDebugLogger(GungnirConfig config) { if (DEBUG_LOG == null) { if (config.getBoolean(DEBUG_ENABLED)) { LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); String host = config.getString(LOG_RECEIVER_HOST); if (host != null) { SocketAppender appender = new SocketAppender(); appender.setRemoteHost(host); appender.setPort(config.getInteger(LOG_RECEIVER_PORT)); appender.setQueueSize(config.getInteger(DEBUG_LOG_APPEND_QUEUE_SIZE)); appender.setReconnectionDelay(config.getInteger(DEBUG_LOG_APPEND_RECONNECT_DELAY)); appender.setContext(lc); appender.getStatusManager().add(new StatusListener() { @Override public void addStatusEvent(Status status) { LOG.info(status.getMessage()); } }); appender.start(); ch.qos.logback.classic.Logger logger = lc.getLogger(LOGGER_NAME); logger.addAppender(appender); logger.setLevel(Level.INFO); DEBUG_LOG = new DebugLogger(logger); } else { if (lc.exists(LOGGER_NAME) != null) { DEBUG_LOG = new DebugLogger(LoggerFactory.getLogger(LOGGER_NAME)); } else { DEBUG_LOG = new DebugLogger(); } } } else { DEBUG_LOG = new DebugLogger(); } } return DEBUG_LOG; } public void setComponent(GungnirComponent component) { this.component = component; } public GungnirComponent getComponent() { return component; } public Object get(String name) { if (name.equalsIgnoreCase(TOPOLOGY_ID)) { return topologyId; } else if (name.equalsIgnoreCase(ACCOUNT_ID)) { return accountId; } else if (name.equalsIgnoreCase(TASK_INDEX)) { return component.getTopologyContext().getThisTaskIndex(); } else if (name.equalsIgnoreCase(TASK_ID)) { return component.getTopologyContext().getThisTaskId(); } return null; } public String replaceVariable(String src) { StringBuilder sb = new StringBuilder(); int start = 0; Matcher matcher = VARIABLE_PATTERN.matcher(src); while (matcher.find()) { sb.append(src.substring(start, matcher.start())); start = matcher.end(); String name = matcher.group(1); Object value = get(name); if (value != null) { sb.append(value.toString()); } else { sb.append(matcher.group(0)); } } if (start == 0) { return src; } if (start <= src.length() - 1) { sb.append(src.substring(start)); } return sb.toString(); } @Override public String toString() { return "{topologyId=" + topologyId + ", topologyName=" + topologyName + ", accountId=" + accountId + ", outputFields=" + outputFields + "}"; } }