提交 8ca4851f 编写于 作者: A ainilife

Abtest Communication Channel initial

上级 693ef477
......@@ -13,7 +13,7 @@
<dependency>
<groupId>org.unidal.framework</groupId>
<artifactId>foundation-service</artifactId>
<version>2.0.2</version>
<version>2.0.3-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.jboss.netty</groupId>
......
......@@ -5,7 +5,7 @@ import javax.servlet.http.HttpServletRequest;
import org.unidal.lookup.ContainerLoader;
import com.dianping.cat.abtest.internal.DefaultABTest;
import com.dianping.cat.abtest.spi.ABTestContextManager;
import com.dianping.cat.abtest.spi.internal.ABTestContextManager;
public final class ABTestManager {
private static ABTestContextManager s_contextManager;
......
......@@ -3,7 +3,7 @@ package com.dianping.cat.abtest.internal;
import com.dianping.cat.abtest.ABTest;
import com.dianping.cat.abtest.ABTestId;
import com.dianping.cat.abtest.spi.ABTestContext;
import com.dianping.cat.abtest.spi.ABTestContextManager;
import com.dianping.cat.abtest.spi.internal.ABTestContextManager;
public class DefaultABTest implements ABTest {
private ABTestContextManager m_contextManager;
......
package com.dianping.cat.abtest.repository;
import java.util.Date;
import java.util.List;
import com.dianping.cat.abtest.spi.ABTestEntity;
public interface ABTestEntityRepository {
public List<ABTestEntity> getEntities(Date from, Date to);
}
package com.dianping.cat.abtest.repository;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import org.unidal.helper.Splitters;
import org.unidal.lookup.annotation.Inject;
import org.unidal.socket.MessageInboundHandler;
import org.unidal.socket.udp.UdpSocket;
import com.dianping.cat.abtest.spi.ABTestEntity;
import com.dianping.cat.configuration.ClientConfigManager;
public class DefaultABTestEntityRepository implements ABTestEntityRepository, Initializable {
@Inject
private ClientConfigManager m_configManager;
@Inject
private InetSocketAddress m_address = new InetSocketAddress("228.0.0.3", 2283);
private UdpSocket m_socket;
private String m_domain;
private List<ABTestEntity> m_entities = new ArrayList<ABTestEntity>();
@Override
public List<ABTestEntity> getEntities(Date from, Date to) {
return null;
}
@Override
public void initialize() throws InitializationException {
m_domain = m_configManager.getFirstDomain().getId();
m_socket = new UdpSocket();
m_socket.setName("ABTest");
m_socket.setCodec(new ProtocolMessageCodec());
m_socket.onMessage(new ProtocolHandler());
m_socket.listenOn(m_address);
}
public void setAddress(String address) {
List<String> parts = Splitters.by(':').trim().split(address);
int len = parts.size();
int index = 0;
String host = len > index ? parts.get(index++) : "228.0.0.3";
String port = len > index ? parts.get(index++) : "2283";
m_address = new InetSocketAddress(host, Integer.parseInt(port));
}
class ProtocolHandler implements MessageInboundHandler<ProtocolMessage> {
@Override
public void handle(ProtocolMessage message) {
String name = message.getName();
if ("hi".equals(name)) {
} else if ("heartbeat".equals(name)) {
List<ABTestEntity> entities = new ArrayList<ABTestEntity>();
m_entities = entities;
}
}
}
}
package com.dianping.cat.abtest.repository;
import java.util.HashMap;
import java.util.Map;
import org.unidal.socket.Message;
public class ProtocolMessage implements Message {
private String m_name;
private String m_content;
private Map<String, String> m_headers = new HashMap<String, String>();
public String getContent() {
return m_content;
}
public Map<String, String> getHeaders() {
return m_headers;
}
public String getName() {
return m_name;
}
public void setContent(String content) {
m_content = content;
}
public void setName(String name) {
m_name = name;
}
@Override
public String toString() {
return String.format("ProtocolMessage[name=%s, content=%s, headers=%s]", m_name, m_content, m_headers);
}
}
\ No newline at end of file
package com.dianping.cat.abtest.repository;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.unidal.socket.MessageCodec;
public class ProtocolMessageCodec implements MessageCodec<ProtocolMessage> {
@Override
public ProtocolMessage decode(ChannelBuffer buf) {
ProtocolMessage message = new ProtocolMessage();
buf.readInt(); // get rid of the place-holder
message.setName(readString(buf));
message.setContent(readString(buf));
while (buf.readable()) {
String key = readString(buf);
String value = readString(buf);
message.getHeaders().put(key, value);
}
return message;
}
@Override
public ChannelBuffer encode(ProtocolMessage message) {
ChannelBuffer buf = ChannelBuffers.dynamicBuffer(4096);
buf.writeInt(0); // place-holder
writeString(buf, message.getName());
writeString(buf, message.getContent());
for (Map.Entry<String, String> e : message.getHeaders().entrySet()) {
writeString(buf, e.getKey());
writeString(buf, e.getValue());
}
return buf;
}
private String readString(ChannelBuffer buf) {
int length = buf.readShort();
if (length == -1) {
return null;
} else {
byte[] bytes = new byte[length];
buf.readBytes(bytes);
try {
return new String(bytes, "utf-8");
} catch (UnsupportedEncodingException e) {
return new String(bytes);
}
}
}
private void writeString(ChannelBuffer buf, String str) {
byte[] bytes = null;
if (str != null) {
try {
bytes = str.getBytes("utf-8");
} catch (UnsupportedEncodingException e) {
bytes = str.getBytes();
}
}
if (bytes == null) {
buf.writeShort(-1);
} else {
buf.writeShort(bytes.length);
buf.writeBytes(bytes);
}
}
}
\ No newline at end of file
package com.dianping.cat.abtest.spi;
package com.dianping.cat.abtest.spi.internal;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.dianping.cat.abtest.ABTestId;
import com.dianping.cat.abtest.spi.ABTestContext;
public interface ABTestContextManager {
public ABTestContext getContext(ABTestId testId);
......
package com.dianping.cat.abtest.spi;
package com.dianping.cat.abtest.spi.internal;
import java.util.List;
import com.dianping.cat.abtest.ABTestId;
import com.dianping.cat.abtest.spi.ABTestEntity;
public interface ABTestEntityManager {
public ABTestEntity getEntity(ABTestId id);
......
......@@ -13,9 +13,7 @@ import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.abtest.ABTestId;
import com.dianping.cat.abtest.spi.ABTestContext;
import com.dianping.cat.abtest.spi.ABTestContextManager;
import com.dianping.cat.abtest.spi.ABTestEntity;
import com.dianping.cat.abtest.spi.ABTestEntityManager;
import com.dianping.cat.abtest.spi.ABTestGroupStrategy;
public class DefaultABTestContextManager extends ContainerHolder implements ABTestContextManager {
......
......@@ -18,7 +18,6 @@ import com.dianping.cat.abtest.model.entity.Run;
import com.dianping.cat.abtest.model.transform.BaseVisitor;
import com.dianping.cat.abtest.model.transform.DefaultSaxParser;
import com.dianping.cat.abtest.spi.ABTestEntity;
import com.dianping.cat.abtest.spi.ABTestEntityManager;
import com.dianping.cat.abtest.spi.ABTestGroupStrategy;
public class DefaultABTestEntityManager extends ContainerHolder implements ABTestEntityManager, Initializable {
......
......@@ -6,10 +6,13 @@ import java.util.List;
import org.unidal.lookup.configuration.AbstractResourceConfigurator;
import org.unidal.lookup.configuration.Component;
import com.dianping.cat.abtest.spi.ABTestContextManager;
import com.dianping.cat.abtest.spi.ABTestEntityManager;
import com.dianping.cat.abtest.repository.ABTestEntityRepository;
import com.dianping.cat.abtest.repository.DefaultABTestEntityRepository;
import com.dianping.cat.abtest.spi.internal.ABTestContextManager;
import com.dianping.cat.abtest.spi.internal.ABTestEntityManager;
import com.dianping.cat.abtest.spi.internal.DefaultABTestContextManager;
import com.dianping.cat.abtest.spi.internal.DefaultABTestEntityManager;
import com.dianping.cat.configuration.ClientConfigManager;
class ABTestComponentConfigurator extends AbstractResourceConfigurator {
@Override
......@@ -21,6 +24,10 @@ class ABTestComponentConfigurator extends AbstractResourceConfigurator {
all.add(C(ABTestEntityManager.class, DefaultABTestEntityManager.class));
all.add(C(ABTestEntityRepository.class, DefaultABTestEntityRepository.class) //
.req(ClientConfigManager.class) //
.config(E("address").value("228.0.0.3:2283")));
return all;
}
}
......@@ -41,13 +41,18 @@ public class ClientConfigManager implements LogEnabled {
}
public Domain getFirstDomain() {
if (m_config == null) {
return new Domain("UNKNOWN").setEnabled(false);
} else {
Domain domain = null;
if (m_config != null) {
Map<String, Domain> domains = m_config.getDomains();
Domain firstDomain = domains.isEmpty() ? null : domains.values().iterator().next();
return firstDomain;
domain = domains.isEmpty() ? null : domains.values().iterator().next();
}
if (domain != null) {
return domain;
} else {
return new Domain("UNKNOWN").setEnabled(false);
}
}
......
......@@ -303,17 +303,33 @@
</requirements>
</component>
<component>
<role>com.dianping.cat.abtest.spi.ABTestContextManager</role>
<role>com.dianping.cat.abtest.spi.internal.ABTestContextManager</role>
<implementation>com.dianping.cat.abtest.spi.internal.DefaultABTestContextManager</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.abtest.spi.ABTestEntityManager</role>
<role>com.dianping.cat.abtest.spi.internal.ABTestEntityManager</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.abtest.spi.ABTestEntityManager</role>
<role>com.dianping.cat.abtest.spi.internal.ABTestEntityManager</role>
<implementation>com.dianping.cat.abtest.spi.internal.DefaultABTestEntityManager</implementation>
</component>
<component>
<role>com.dianping.cat.abtest.spi.internal.ABTestEntityRepository</role>
<implementation>com.dianping.cat.abtest.spi.internal.DefaultABTestEntityRepository</implementation>
<configuration>
<address>228.0.0.3:2283</address>
</configuration>
<requirements>
<requirement>
<role>com.dianping.cat.configuration.ClientConfigManager</role>
</requirement>
<requirement>
<role>org.unidal.socket.udp.UdpSocket</role>
<role-hint>abtest</role-hint>
</requirement>
</requirements>
</component>
</components>
</plexus>
package com.dianping.cat.abtest.demo.annotation;
import com.dianping.cat.abtest.annotation.Cookie;
import com.dianping.cat.abtest.spi.ABTestContext;
import com.dianping.cat.abtest.spi.ABTestGroupStrategy;
public class CookieGroupStrategy implements ABTestGroupStrategy{
@Cookie("cityId")
private String cityId;
@Override
public void apply(ABTestContext ctx) {
if(cityId.equals("default")){
}else{
ctx.setGroupName("A");
}
}
}
......@@ -6,8 +6,8 @@ import java.util.List;
import org.unidal.lookup.configuration.AbstractResourceConfigurator;
import org.unidal.lookup.configuration.Component;
import com.dianping.cat.abtest.spi.ABTestEntityManager;
import com.dianping.cat.abtest.spi.ABTestGroupStrategy;
import com.dianping.cat.abtest.spi.internal.ABTestEntityManager;
import com.dianping.cat.abtest.spi.internal.DefaultABTestEntityManager;
public class ABTestServerConfigurator extends AbstractResourceConfigurator {
......
......@@ -9,7 +9,6 @@ import org.junit.Test;
import org.unidal.lookup.ComponentTestCase;
import com.dianping.cat.abtest.spi.ABTestEntity;
import com.dianping.cat.abtest.spi.ABTestEntityManager;
public class DefaultABTestEntityManagerTest extends ComponentTestCase {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册