diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/ComponentsConfigurator.java b/cat-core/src/main/java/com/dianping/cat/configuration/ComponentsConfigurator.java
index 6c9e6822b6b1627551351df5194fa25b6480a46b..4b33036e59b606c5ed07db8cb814d27743203bd4 100644
--- a/cat-core/src/main/java/com/dianping/cat/configuration/ComponentsConfigurator.java
+++ b/cat-core/src/main/java/com/dianping/cat/configuration/ComponentsConfigurator.java
@@ -21,6 +21,7 @@ import com.dianping.cat.message.spi.MessageConsumerRegistry;
import com.dianping.cat.message.spi.MessageHandler;
import com.dianping.cat.message.spi.MessageManager;
import com.dianping.cat.message.spi.MessagePathBuilder;
+import com.dianping.cat.message.spi.MessageStorage;
import com.dianping.cat.message.spi.codec.BufferWriter;
import com.dianping.cat.message.spi.codec.EscapingBufferWriter;
import com.dianping.cat.message.spi.codec.HtmlEncodingBufferWriter;
@@ -31,6 +32,7 @@ import com.dianping.cat.message.spi.consumer.DumpToHtmlConsumer;
import com.dianping.cat.message.spi.internal.DefaultMessageConsumerRegistry;
import com.dianping.cat.message.spi.internal.DefaultMessageHandler;
import com.dianping.cat.message.spi.internal.DefaultMessagePathBuilder;
+import com.dianping.cat.message.spi.internal.DefaultMessageStorage;
import com.site.lookup.configuration.AbstractResourceConfigurator;
import com.site.lookup.configuration.Component;
@@ -50,6 +52,9 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
.req(MessageManager.class));
all.add(C(MessagePathBuilder.class, DefaultMessagePathBuilder.class) //
.req(MessageManager.class));
+ all.add(C(MessageStorage.class, "html", DefaultMessageStorage.class) //
+ .req(MessagePathBuilder.class) //
+ .req(MessageCodec.class, "html-encode"));
all.add(C(BufferWriter.class, "escape", EscapingBufferWriter.class));
all.add(C(BufferWriter.class, "html-encode", HtmlEncodingBufferWriter.class));
diff --git a/cat-core/src/main/java/com/dianping/cat/message/internal/DefaultMessageManager.java b/cat-core/src/main/java/com/dianping/cat/message/internal/DefaultMessageManager.java
index f6ae1d7cb3fa959ed9840ca0288a7ccf9fe762eb..67c7c53531fb642db3d452444e634b5c361da192 100644
--- a/cat-core/src/main/java/com/dianping/cat/message/internal/DefaultMessageManager.java
+++ b/cat-core/src/main/java/com/dianping/cat/message/internal/DefaultMessageManager.java
@@ -3,6 +3,7 @@ package com.dianping.cat.message.internal;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Stack;
+import java.util.UUID;
import com.dianping.cat.configuration.model.entity.Config;
import com.dianping.cat.message.Message;
@@ -128,7 +129,7 @@ public class DefaultMessageManager extends ContainerHolder implements MessageMan
m_tree.setThreadId(Long.toHexString(Thread.currentThread().getId()));
m_tree.setHostName(hostName);
m_tree.setIpAddress(ipAddress);
- m_tree.setMessageId("?"); // TODO
+ m_tree.setMessageId(UUID.randomUUID().toString()); // TODO optimize it to shorter UUID
}
public void add(DefaultMessageManager manager, Message message) {
diff --git a/cat-core/src/main/java/com/dianping/cat/message/spi/MessagePathBuilder.java b/cat-core/src/main/java/com/dianping/cat/message/spi/MessagePathBuilder.java
index 82fc8b16e4aa4040f68d31eea469cf6967bf0a38..93e4294621969066794f5da633dd03ffab4de1a2 100644
--- a/cat-core/src/main/java/com/dianping/cat/message/spi/MessagePathBuilder.java
+++ b/cat-core/src/main/java/com/dianping/cat/message/spi/MessagePathBuilder.java
@@ -4,7 +4,9 @@ import java.io.File;
import java.net.URL;
public interface MessagePathBuilder {
- public URL getLogViewUrl(MessageTree tree);
+ public File getLogViewBaseDir();
- public File getLogViewFile(MessageTree tree);
+ public URL getLogViewBaseUrl();
+
+ public String getLogViewPath(MessageTree tree);
}
diff --git a/cat-core/src/main/java/com/dianping/cat/message/spi/MessageStorage.java b/cat-core/src/main/java/com/dianping/cat/message/spi/MessageStorage.java
new file mode 100644
index 0000000000000000000000000000000000000000..f4164bcdea65c986fae5e304fe04710adcc000fc
--- /dev/null
+++ b/cat-core/src/main/java/com/dianping/cat/message/spi/MessageStorage.java
@@ -0,0 +1,19 @@
+package com.dianping.cat.message.spi;
+
+import java.io.File;
+import java.net.URL;
+
+public interface MessageStorage {
+ public File getBaseDir();
+
+ public URL getBaseUrl();
+
+ /**
+ * Store a message tree to the storage.
+ *
+ * @param tree
+ * message tree to store
+ * @return relative path to base directory or base URL
+ */
+ public String store(MessageTree tree);
+}
diff --git a/cat-core/src/main/java/com/dianping/cat/message/spi/consumer/DumpToHtmlConsumer.java b/cat-core/src/main/java/com/dianping/cat/message/spi/consumer/DumpToHtmlConsumer.java
index 8af47334d2affed784d46fdff2cb3c7012eb772b..759f5c8dea4363dad5dee43fbb0641615eafb14f 100644
--- a/cat-core/src/main/java/com/dianping/cat/message/spi/consumer/DumpToHtmlConsumer.java
+++ b/cat-core/src/main/java/com/dianping/cat/message/spi/consumer/DumpToHtmlConsumer.java
@@ -18,15 +18,16 @@ public class DumpToHtmlConsumer implements MessageConsumer {
private MessageCodec m_codec;
@Inject
- private MessagePathBuilder m_pathBuilder;
+ private MessagePathBuilder m_builder;
@Override
public void consume(MessageTree tree) {
- File file = m_pathBuilder.getLogViewFile(tree);
+ File baseDir = m_builder.getLogViewBaseDir();
+ File file = new File(baseDir, m_builder.getLogViewPath(tree));
FileOutputStream fos = null;
try {
- ChannelBuffer buf = ChannelBuffers.buffer(8192);
+ ChannelBuffer buf = ChannelBuffers.dynamicBuffer(8192);
m_codec.encode(tree, buf);
fos = new FileOutputStream(file);
@@ -42,7 +43,6 @@ public class DumpToHtmlConsumer implements MessageConsumer {
}
}
}
-
}
@Override
diff --git a/cat-core/src/main/java/com/dianping/cat/message/spi/internal/DefaultMessagePathBuilder.java b/cat-core/src/main/java/com/dianping/cat/message/spi/internal/DefaultMessagePathBuilder.java
index f691ad9335f4c8396fd05f0616f7bff9db586371..27944ce5ce18af7278a942c2d382eaf34d8afdb0 100644
--- a/cat-core/src/main/java/com/dianping/cat/message/spi/internal/DefaultMessagePathBuilder.java
+++ b/cat-core/src/main/java/com/dianping/cat/message/spi/internal/DefaultMessagePathBuilder.java
@@ -24,28 +24,17 @@ public class DefaultMessagePathBuilder implements MessagePathBuilder, Initializa
private URL m_baseLogUrl;
@Override
- public File getLogViewFile(MessageTree tree) {
- String relativePath = getRelativePath(tree);
- File file = new File(m_baseLogDir, relativePath);
-
- return file;
+ public File getLogViewBaseDir() {
+ return m_baseLogDir;
}
@Override
- public URL getLogViewUrl(MessageTree tree) {
- String relativePath = getRelativePath(tree);
-
- try {
- URL url = new URL(m_baseLogUrl, relativePath);
-
- return url;
- } catch (MalformedURLException e) {
- throw new RuntimeException(String.format("Unable to construct message URL(%s, %s)!", m_baseLogUrl,
- relativePath), e);
- }
+ public URL getLogViewBaseUrl() {
+ return m_baseLogUrl;
}
- private String getRelativePath(MessageTree tree) {
+ @Override
+ public String getLogViewPath(MessageTree tree) {
MessageFormat format = new MessageFormat("{0,date,yyyyMMdd}/{1}/{2}");
Date date = new Date(tree.getMessage().getTimestamp());
String path = format.format(new Object[] { date, tree.getDomain(), tree.getMessageId() });
diff --git a/cat-core/src/main/java/com/dianping/cat/message/spi/internal/DefaultMessageStorage.java b/cat-core/src/main/java/com/dianping/cat/message/spi/internal/DefaultMessageStorage.java
new file mode 100644
index 0000000000000000000000000000000000000000..4ac5263da626ebf7f2263f3545de951270a0f428
--- /dev/null
+++ b/cat-core/src/main/java/com/dianping/cat/message/spi/internal/DefaultMessageStorage.java
@@ -0,0 +1,70 @@
+package com.dianping.cat.message.spi.internal;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URL;
+
+import org.codehaus.plexus.logging.LogEnabled;
+import org.codehaus.plexus.logging.Logger;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+
+import com.dianping.cat.message.spi.MessageCodec;
+import com.dianping.cat.message.spi.MessagePathBuilder;
+import com.dianping.cat.message.spi.MessageStorage;
+import com.dianping.cat.message.spi.MessageTree;
+import com.site.lookup.annotation.Inject;
+
+public class DefaultMessageStorage implements MessageStorage, LogEnabled {
+ @Inject
+ private MessagePathBuilder m_builder;
+
+ @Inject
+ private MessageCodec m_codec;
+
+ private Logger m_logger;
+
+ @Override
+ public void enableLogging(Logger logger) {
+ m_logger = logger;
+ }
+
+ @Override
+ public File getBaseDir() {
+ return m_builder.getLogViewBaseDir();
+ }
+
+ @Override
+ public URL getBaseUrl() {
+ return m_builder.getLogViewBaseUrl();
+ }
+
+ @Override
+ public String store(MessageTree tree) {
+ String path = m_builder.getLogViewPath(tree);
+ File file = new File(m_builder.getLogViewBaseDir(), path);
+ ChannelBuffer buf = ChannelBuffers.dynamicBuffer(8192);
+ FileOutputStream fos = null;
+
+ file.getParentFile().mkdirs();
+
+ try {
+ m_codec.encode(tree, buf);
+ fos = new FileOutputStream(file);
+ buf.getBytes(buf.readerIndex(), fos, buf.readableBytes());
+ } catch (IOException e) {
+ m_logger.error(String.format("Error when writing to file(%s)!", file), e);
+ } finally {
+ if (fos != null) {
+ try {
+ fos.close();
+ } catch (IOException e) {
+ // ignore it
+ }
+ }
+ }
+
+ return path;
+ }
+}
diff --git a/cat-core/src/main/resources/META-INF/dal/model/model.xml b/cat-core/src/main/resources/META-INF/dal/model/model.xml
index f10f0d22a5d6f95d4688ecf6921ba930718f7c30..333b3c371a05e67cf0e33c496c0572cecd344554 100644
--- a/cat-core/src/main/resources/META-INF/dal/model/model.xml
+++ b/cat-core/src/main/resources/META-INF/dal/model/model.xml
@@ -3,7 +3,7 @@
enable-xml-schema="true" enable-xml-sample="true">
-
+
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 c1e9c28cc18d39baae695701c13924d132969ced..1b8c54d76df48e2794b4f33cf432557c08e3604a 100644
--- a/cat-core/src/main/resources/META-INF/plexus/components.xml
+++ b/cat-core/src/main/resources/META-INF/plexus/components.xml
@@ -46,6 +46,20 @@
+
+ com.dianping.cat.message.spi.MessageStorage
+ html
+ com.dianping.cat.message.spi.internal.DefaultMessageStorage
+
+
+ com.dianping.cat.message.spi.MessagePathBuilder
+
+
+ com.dianping.cat.message.spi.MessageCodec
+ html-encode
+
+
+
com.dianping.cat.message.spi.codec.BufferWriter
escape
diff --git a/cat-home/src/test/intg/com/dianping/cat/AllAllTests.java b/cat-home/src/test/intg/com/dianping/cat/AllAllTests.java
new file mode 100644
index 0000000000000000000000000000000000000000..077f9cad265ac9ffe0d416a10baea7c55c4ec593
--- /dev/null
+++ b/cat-home/src/test/intg/com/dianping/cat/AllAllTests.java
@@ -0,0 +1,17 @@
+package com.dianping.cat;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+
+@RunWith(Suite.class)
+@SuiteClasses({
+
+com.dianping.cat.message.AllTests.class,
+
+com.dianping.cat.consumer.AllTests.class,
+
+})
+public class AllAllTests {
+
+}
diff --git a/java_formatter.xml b/java_formatter.xml
new file mode 100644
index 0000000000000000000000000000000000000000..526b848afc2606bd53e35a1ef6daf6a8b2439cd5
--- /dev/null
+++ b/java_formatter.xml
@@ -0,0 +1,291 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+