From 3f9d6fd9b831bb03eb7f5b7600e21fe177f48fe5 Mon Sep 17 00:00:00 2001 From: ainilife Date: Tue, 28 May 2013 11:35:01 +0800 Subject: [PATCH] Client Side communication channel --- .../repository/ABTestEntityRepository.java | 7 +- .../DefaultABTestEntityRepository.java | 63 +++++++++++++--- .../abtest/repository/ProtocolMessage.java | 4 + .../cat/abtest/repository/ProtocolNames.java | 13 ++++ .../dianping/cat/abtest/spi/ABTestEntity.java | 68 ++++++++--------- .../spi/internal/ABTestEntityManager.java | 1 + .../internal/DefaultABTestContextManager.java | 1 - .../internal/DefaultABTestEntityManager.java | 74 +++++-------------- .../build/ABTestComponentConfigurator.java | 5 +- .../resources/META-INF/plexus/components.xml | 17 +++-- 10 files changed, 142 insertions(+), 111 deletions(-) create mode 100644 cat-core/src/main/java/com/dianping/cat/abtest/repository/ProtocolNames.java diff --git a/cat-core/src/main/java/com/dianping/cat/abtest/repository/ABTestEntityRepository.java b/cat-core/src/main/java/com/dianping/cat/abtest/repository/ABTestEntityRepository.java index ef3d4a198..edef0ea3d 100644 --- a/cat-core/src/main/java/com/dianping/cat/abtest/repository/ABTestEntityRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/abtest/repository/ABTestEntityRepository.java @@ -1,10 +1,11 @@ package com.dianping.cat.abtest.repository; -import java.util.Date; -import java.util.List; +import java.util.Map; import com.dianping.cat.abtest.spi.ABTestEntity; public interface ABTestEntityRepository { - public List getEntities(Date from, Date to); + + public Map getAllEntities(); + } diff --git a/cat-core/src/main/java/com/dianping/cat/abtest/repository/DefaultABTestEntityRepository.java b/cat-core/src/main/java/com/dianping/cat/abtest/repository/DefaultABTestEntityRepository.java index 963f0f98a..6371c3103 100644 --- a/cat-core/src/main/java/com/dianping/cat/abtest/repository/DefaultABTestEntityRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/abtest/repository/DefaultABTestEntityRepository.java @@ -1,17 +1,24 @@ package com.dianping.cat.abtest.repository; import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.codehaus.plexus.util.StringUtils; 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.Cat; +import com.dianping.cat.abtest.model.entity.AbtestModel; +import com.dianping.cat.abtest.model.entity.Case; +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.configuration.ClientConfigManager; @@ -26,11 +33,11 @@ public class DefaultABTestEntityRepository implements ABTestEntityRepository, In private String m_domain; - private List m_entities = new ArrayList(); + private Map m_entities = new HashMap(); @Override - public List getEntities(Date from, Date to) { - return null; + public Map getAllEntities() { + return m_entities; } @Override @@ -42,6 +49,11 @@ public class DefaultABTestEntityRepository implements ABTestEntityRepository, In m_socket.setCodec(new ProtocolMessageCodec()); m_socket.onMessage(new ProtocolHandler()); m_socket.listenOn(m_address); + + ProtocolMessage hi = new ProtocolMessage(); + hi.setName(ProtocolNames.HI); + hi.addHeader(ProtocolNames.HEARTBEAT, m_domain); + m_socket.send(hi); } public void setAddress(String address) { @@ -59,12 +71,45 @@ public class DefaultABTestEntityRepository implements ABTestEntityRepository, In public void handle(ProtocolMessage message) { String name = message.getName(); - if ("hi".equals(name)) { - } else if ("heartbeat".equals(name)) { - List entities = new ArrayList(); + if (ProtocolNames.HEARTBEAT.equalsIgnoreCase(name)) { + String content = message.getContent(); + if (StringUtils.isNotBlank(content)) { + try { + AbtestModel abtest = DefaultSaxParser.parse(content); + ABTestVisitor visitor = new ABTestVisitor(); + + abtest.accept(visitor); + + m_entities = visitor.getEntities(); + } catch (Exception e) { + Cat.logError(e); + } + } + } + } + } + + class ABTestVisitor extends BaseVisitor { + private Map m_entities; + + public ABTestVisitor() { + m_entities = new HashMap(); + } - m_entities = entities; + @Override + public void visitCase(Case _case) { + for (Run run : _case.getRuns()) { + // filter abtest-entities by domain + if (run.getDomains() != null && run.getDomains().contains(m_domain)) { + ABTestEntity abTestEntity = new ABTestEntity(_case, run); + + m_entities.put(abTestEntity.getId(), abTestEntity); + } } } + + public Map getEntities() { + return m_entities; + } } } diff --git a/cat-core/src/main/java/com/dianping/cat/abtest/repository/ProtocolMessage.java b/cat-core/src/main/java/com/dianping/cat/abtest/repository/ProtocolMessage.java index adcce8d64..3367bc66c 100644 --- a/cat-core/src/main/java/com/dianping/cat/abtest/repository/ProtocolMessage.java +++ b/cat-core/src/main/java/com/dianping/cat/abtest/repository/ProtocolMessage.java @@ -15,6 +15,10 @@ public class ProtocolMessage implements Message { public String getContent() { return m_content; } + + public void addHeader(String header, String value){ + m_headers.put(header,value); + } public Map getHeaders() { return m_headers; diff --git a/cat-core/src/main/java/com/dianping/cat/abtest/repository/ProtocolNames.java b/cat-core/src/main/java/com/dianping/cat/abtest/repository/ProtocolNames.java new file mode 100644 index 000000000..47726f4db --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/abtest/repository/ProtocolNames.java @@ -0,0 +1,13 @@ +package com.dianping.cat.abtest.repository; + +public class ProtocolNames { + + // protocol method + public static final String HI = "hi"; + + public static final String HEARTBEAT = "heartbeat"; + + // protocol headers + public static final String DOMAIN = "domain"; + +} diff --git a/cat-core/src/main/java/com/dianping/cat/abtest/spi/ABTestEntity.java b/cat-core/src/main/java/com/dianping/cat/abtest/spi/ABTestEntity.java index 4ea53af00..54d8a5144 100644 --- a/cat-core/src/main/java/com/dianping/cat/abtest/spi/ABTestEntity.java +++ b/cat-core/src/main/java/com/dianping/cat/abtest/spi/ABTestEntity.java @@ -6,39 +6,37 @@ import com.dianping.cat.abtest.model.entity.Case; import com.dianping.cat.abtest.model.entity.Run; public class ABTestEntity { - private Case m_case; + + private int m_id; + + private String m_name; + + private String m_groupStrategyName; private Run m_run; private ABTestGroupStrategy m_groupStrategy; - + public ABTestEntity() { - m_case = new Case(); m_run = new Run(); m_run.setDisabled(true); } public ABTestEntity(Case _case, Run run) { - m_case = _case; + m_id = _case.getId(); + m_name = _case.getName(); + m_groupStrategyName = _case.getGroupStrategy(); m_run = run; } public String getGroupStrategyName() { - return m_case.getGroupStrategy() != null ? m_case.getGroupStrategy() : null; + return m_groupStrategyName != null ? m_groupStrategyName : null; } public String getGroupStrategyConfiguration() { return m_run.getGroupStrategyConfiguration() != null ? m_run.getGroupStrategyConfiguration() : null; } - public int getId() { - return m_case.getId(); - } - - public String getName() { - return m_case.getName(); - } - public Date getEndDate() { return m_run.getEndDate(); } @@ -77,22 +75,6 @@ public class ABTestEntity { m_run.setDisabled(disabled); } - public void setGroupStrategyName(String groupStrategy) { - m_case.setGroupStrategy(groupStrategy); - } - - public void setGroupStrategyConfiguration(String groupStrategyConfiguration) { - m_run.setGroupStrategyConfiguration(groupStrategyConfiguration); - } - - public void setId(int id) { - m_case.setId(id); - } - - public void setName(String name) { - m_case.setName(name); - } - public ABTestGroupStrategy getGroupStrategy() { return m_groupStrategy; } @@ -100,18 +82,31 @@ public class ABTestEntity { public void setGroupStrategy(ABTestGroupStrategy groupStrategy) { m_groupStrategy = groupStrategy; } + + public void setId(int id){ + m_id = id; + } - @Override - public String toString() { - return String.format("%s[id=%s, name=%s, groupStrategy=%s, configuation=%s]", getClass().getSimpleName(), - getId(), getName(), getGroupStrategyName(), getGroupStrategyConfiguration()); + public int getId() { + return m_id; + } + + public String getName() { + return m_name; + } + + public Run getRun() { + return m_run; } @Override public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + getId(); + result = prime * result + ((m_groupStrategy == null) ? 0 : m_groupStrategy.hashCode()); + result = prime * result + ((m_groupStrategyName == null) ? 0 : m_groupStrategyName.hashCode()); + result = prime * result + m_id; + result = prime * result + ((m_run == null) ? 0 : m_run.hashCode()); return result; } @@ -129,4 +124,9 @@ public class ABTestEntity { return true; } + @Override + public String toString() { + return "ABTestEntity [m_id=" + m_id + ", m_groupStrategyName=" + m_groupStrategyName + ", m_run=" + m_run + + ", m_groupStrategy=" + m_groupStrategy + "]"; + } } \ No newline at end of file diff --git a/cat-core/src/main/java/com/dianping/cat/abtest/spi/internal/ABTestEntityManager.java b/cat-core/src/main/java/com/dianping/cat/abtest/spi/internal/ABTestEntityManager.java index 96d64e448..bf68f9543 100644 --- a/cat-core/src/main/java/com/dianping/cat/abtest/spi/internal/ABTestEntityManager.java +++ b/cat-core/src/main/java/com/dianping/cat/abtest/spi/internal/ABTestEntityManager.java @@ -6,6 +6,7 @@ import com.dianping.cat.abtest.ABTestId; import com.dianping.cat.abtest.spi.ABTestEntity; public interface ABTestEntityManager { + public ABTestEntity getEntity(ABTestId id); public List getEntityList(); diff --git a/cat-core/src/main/java/com/dianping/cat/abtest/spi/internal/DefaultABTestContextManager.java b/cat-core/src/main/java/com/dianping/cat/abtest/spi/internal/DefaultABTestContextManager.java index 15e95a033..b410690e9 100644 --- a/cat-core/src/main/java/com/dianping/cat/abtest/spi/internal/DefaultABTestContextManager.java +++ b/cat-core/src/main/java/com/dianping/cat/abtest/spi/internal/DefaultABTestContextManager.java @@ -134,5 +134,4 @@ public class DefaultABTestContextManager extends ContainerHolder implements ABTe m_req = req; } } - } diff --git a/cat-core/src/main/java/com/dianping/cat/abtest/spi/internal/DefaultABTestEntityManager.java b/cat-core/src/main/java/com/dianping/cat/abtest/spi/internal/DefaultABTestEntityManager.java index 5218c6e09..90e664eda 100644 --- a/cat-core/src/main/java/com/dianping/cat/abtest/spi/internal/DefaultABTestEntityManager.java +++ b/cat-core/src/main/java/com/dianping/cat/abtest/spi/internal/DefaultABTestEntityManager.java @@ -1,92 +1,58 @@ package com.dianping.cat.abtest.spi.internal; -import java.io.InputStream; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.unidal.lookup.ContainerHolder; +import org.unidal.lookup.annotation.Inject; import com.dianping.cat.Cat; import com.dianping.cat.abtest.ABTestId; -import com.dianping.cat.abtest.model.entity.AbtestModel; -import com.dianping.cat.abtest.model.entity.Case; -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.repository.ABTestEntityRepository; import com.dianping.cat.abtest.spi.ABTestEntity; import com.dianping.cat.abtest.spi.ABTestGroupStrategy; public class DefaultABTestEntityManager extends ContainerHolder implements ABTestEntityManager, Initializable { - private Map m_entities = new HashMap(); - private List m_entityList = new ArrayList(); + @Inject + private ABTestEntityRepository m_repository; @Override public ABTestEntity getEntity(ABTestId id) { - ABTestEntity entity = m_entities.get(id.getValue()); + ABTestEntity entity = m_repository.getAllEntities().get(id.getValue()); if (entity == null) { entity = new ABTestEntity(); + entity.setId(id.getValue()); entity.setDisabled(true); - m_entities.put(id.getValue(), entity); + m_repository.getAllEntities().put(id.getValue(), entity); } return entity; } - @Override public List getEntityList() { - return m_entityList; + List entitiesList = new ArrayList(); + for (ABTestEntity entity : m_repository.getAllEntities().values()) { + entitiesList.add(entity); + } + return entitiesList; } @Override public void initialize() throws InitializationException { - try { - InputStream in = getClass().getResourceAsStream("abtest.xml"); - AbtestModel abtest = DefaultSaxParser.parse(in); - ABTestVisitor visitor = new ABTestVisitor(m_entities, m_entityList); - - abtest.accept(visitor); - - for (ABTestEntity entity : m_entityList) { - try { - ABTestGroupStrategy groupStrategy = lookup(ABTestGroupStrategy.class, entity.getGroupStrategyName()); - - entity.setGroupStrategy(groupStrategy); - } catch (Exception e) { - Cat.logError(e); - entity.setDisabled(true); - } + for (ABTestEntity entity : m_repository.getAllEntities().values()) { + try { + ABTestGroupStrategy groupStrategy = lookup(ABTestGroupStrategy.class, entity.getGroupStrategyName()); + + entity.setGroupStrategy(groupStrategy); + } catch (Exception e) { + Cat.logError(e); + entity.setDisabled(true); } - } catch (Exception e) { - throw new InitializationException("Error when loading resource(abtest.xml)!", e); } } - - static class ABTestVisitor extends BaseVisitor { - private Map m_entities; - - private List m_entityList; - - public ABTestVisitor(Map entities, List entityList) { - m_entities = entities; - m_entityList = entityList; - } - - @Override - public void visitCase(Case _case) { - for (Run run : _case.getRuns()) { - ABTestEntity abTestEntity = new ABTestEntity(_case, run); - - m_entities.put(abTestEntity.getId(), abTestEntity); - m_entityList.add(abTestEntity); - } - } - } - } \ No newline at end of file diff --git a/cat-core/src/main/java/com/dianping/cat/build/ABTestComponentConfigurator.java b/cat-core/src/main/java/com/dianping/cat/build/ABTestComponentConfigurator.java index 9ff73c044..9cd5df5e7 100644 --- a/cat-core/src/main/java/com/dianping/cat/build/ABTestComponentConfigurator.java +++ b/cat-core/src/main/java/com/dianping/cat/build/ABTestComponentConfigurator.java @@ -22,12 +22,13 @@ class ABTestComponentConfigurator extends AbstractResourceConfigurator { all.add(C(ABTestContextManager.class, DefaultABTestContextManager.class) // .req(ABTestEntityManager.class)); - 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"))); + all.add(C(ABTestEntityManager.class, DefaultABTestEntityManager.class) // + .req(ABTestEntityRepository.class)); + return all; } } diff --git a/cat-core/src/main/resources/META-INF/plexus/components.xml b/cat-core/src/main/resources/META-INF/plexus/components.xml index 6d731d1d1..e1c45a699 100644 --- a/cat-core/src/main/resources/META-INF/plexus/components.xml +++ b/cat-core/src/main/resources/META-INF/plexus/components.xml @@ -312,12 +312,8 @@ - com.dianping.cat.abtest.spi.internal.ABTestEntityManager - com.dianping.cat.abtest.spi.internal.DefaultABTestEntityManager - - - com.dianping.cat.abtest.spi.internal.ABTestEntityRepository - com.dianping.cat.abtest.spi.internal.DefaultABTestEntityRepository + com.dianping.cat.abtest.repository.ABTestEntityRepository + com.dianping.cat.abtest.repository.DefaultABTestEntityRepository
228.0.0.3:2283
@@ -325,9 +321,14 @@ com.dianping.cat.configuration.ClientConfigManager + +
+ + com.dianping.cat.abtest.spi.internal.ABTestEntityManager + com.dianping.cat.abtest.spi.internal.DefaultABTestEntityManager + - org.unidal.socket.udp.UdpSocket - abtest + com.dianping.cat.abtest.repository.ABTestEntityRepository -- GitLab