From 33c47b2df06abfdcf58478782863e2663e0c0ca1 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Wed, 27 Apr 2011 11:48:01 +0100 Subject: [PATCH] Pull over log4j demo from Tomas --- log4j/pom.xml | 223 ++++++++++ .../server/RabbitServerConfiguration.java | 107 +++++ .../converter/AmqpLogMessageConverter.java | 93 ++++ .../listener/AmqpLogMessageListener.java | 51 +++ .../rabbit/log4j/service/AbstractService.java | 42 ++ .../amqp/rabbit/log4j/service/ServiceA.java | 21 + .../amqp/rabbit/log4j/service/ServiceB.java | 21 + .../web/controller/AppServiceController.java | 169 +++++++ .../log4j/web/controller/LogsController.java | 110 +++++ .../log4j/web/domain/AmqpLogMessage.java | 68 +++ log4j/src/main/resources/log4j.properties | 54 +++ .../resources/server-bootstrap-config.xml | 11 + log4j/src/main/resources/servlet-config.xml | 20 + .../src/main/resources/static/css/colors.css | 203 +++++++++ log4j/src/main/resources/static/css/local.css | 198 ++++++++ log4j/src/main/resources/static/css/main.css | 421 ++++++++++++++++++ .../resources/static/images/ajax-loader.gif | Bin 0 -> 2545 bytes .../main/resources/static/images/delete.png | Bin 0 -> 431 bytes .../main/resources/static/images/favicon.ico | Bin 0 -> 367958 bytes .../resources/static/images/footer-left.png | Bin 0 -> 2867 bytes .../resources/static/images/footer-right.png | Bin 0 -> 2865 bytes .../static/images/footer-stretch.png | Bin 0 -> 2826 bytes .../resources/static/images/header-left.png | Bin 0 -> 44766 bytes .../resources/static/images/header-right.png | Bin 0 -> 10472 bytes .../static/images/header-stretch.png | Bin 0 -> 2884 bytes .../src/main/resources/static/images/help.png | Bin 0 -> 786 bytes .../main/resources/static/images/issues.gif | Bin 0 -> 173 bytes .../resources/static/images/module-icon.png | Bin 0 -> 2935 bytes .../static/images/powered-by-spring.png | Bin 0 -> 6591 bytes .../static/images/primary-item-background.png | Bin 0 -> 2908 bytes .../static/images/primary-menu-stretch.png | Bin 0 -> 2912 bytes .../static/images/primary-wrapper-left.png | Bin 0 -> 3037 bytes .../static/images/primary-wrapper-right.png | Bin 0 -> 3059 bytes .../static/images/springsource_logo.png | Bin 0 -> 9310 bytes .../static/images/table-header-background.png | Bin 0 -> 2852 bytes .../images/table-header-bottom-background.png | Bin 0 -> 176 bytes .../images/table-header-top-background.png | Bin 0 -> 180 bytes .../main/resources/static/js/jquery.min.js | 167 +++++++ .../resources/static/js/jquery.mustache.js | 340 ++++++++++++++ log4j/src/main/webapp/WEB-INF/web.xml | 56 +++ log4j/src/main/webapp/index.jsp | 327 ++++++++++++++ .../AnnotationConfigContextLoader.java | 30 ++ .../log4j/web/controller/IntegrationTest.java | 103 +++++ pom.xml | 1 + 44 files changed, 2836 insertions(+) create mode 100644 log4j/pom.xml create mode 100644 log4j/src/main/java/org/springframework/amqp/rabbit/log4j/config/server/RabbitServerConfiguration.java create mode 100644 log4j/src/main/java/org/springframework/amqp/rabbit/log4j/converter/AmqpLogMessageConverter.java create mode 100644 log4j/src/main/java/org/springframework/amqp/rabbit/log4j/listener/AmqpLogMessageListener.java create mode 100644 log4j/src/main/java/org/springframework/amqp/rabbit/log4j/service/AbstractService.java create mode 100644 log4j/src/main/java/org/springframework/amqp/rabbit/log4j/service/ServiceA.java create mode 100644 log4j/src/main/java/org/springframework/amqp/rabbit/log4j/service/ServiceB.java create mode 100644 log4j/src/main/java/org/springframework/amqp/rabbit/log4j/web/controller/AppServiceController.java create mode 100644 log4j/src/main/java/org/springframework/amqp/rabbit/log4j/web/controller/LogsController.java create mode 100644 log4j/src/main/java/org/springframework/amqp/rabbit/log4j/web/domain/AmqpLogMessage.java create mode 100644 log4j/src/main/resources/log4j.properties create mode 100644 log4j/src/main/resources/server-bootstrap-config.xml create mode 100644 log4j/src/main/resources/servlet-config.xml create mode 100644 log4j/src/main/resources/static/css/colors.css create mode 100644 log4j/src/main/resources/static/css/local.css create mode 100644 log4j/src/main/resources/static/css/main.css create mode 100644 log4j/src/main/resources/static/images/ajax-loader.gif create mode 100644 log4j/src/main/resources/static/images/delete.png create mode 100644 log4j/src/main/resources/static/images/favicon.ico create mode 100644 log4j/src/main/resources/static/images/footer-left.png create mode 100644 log4j/src/main/resources/static/images/footer-right.png create mode 100644 log4j/src/main/resources/static/images/footer-stretch.png create mode 100644 log4j/src/main/resources/static/images/header-left.png create mode 100644 log4j/src/main/resources/static/images/header-right.png create mode 100644 log4j/src/main/resources/static/images/header-stretch.png create mode 100644 log4j/src/main/resources/static/images/help.png create mode 100644 log4j/src/main/resources/static/images/issues.gif create mode 100644 log4j/src/main/resources/static/images/module-icon.png create mode 100644 log4j/src/main/resources/static/images/powered-by-spring.png create mode 100644 log4j/src/main/resources/static/images/primary-item-background.png create mode 100644 log4j/src/main/resources/static/images/primary-menu-stretch.png create mode 100644 log4j/src/main/resources/static/images/primary-wrapper-left.png create mode 100644 log4j/src/main/resources/static/images/primary-wrapper-right.png create mode 100644 log4j/src/main/resources/static/images/springsource_logo.png create mode 100644 log4j/src/main/resources/static/images/table-header-background.png create mode 100644 log4j/src/main/resources/static/images/table-header-bottom-background.png create mode 100644 log4j/src/main/resources/static/images/table-header-top-background.png create mode 100644 log4j/src/main/resources/static/js/jquery.min.js create mode 100644 log4j/src/main/resources/static/js/jquery.mustache.js create mode 100644 log4j/src/main/webapp/WEB-INF/web.xml create mode 100644 log4j/src/main/webapp/index.jsp create mode 100644 log4j/src/test/java/org/springframework/amqp/rabbit/log4j/web/controller/AnnotationConfigContextLoader.java create mode 100644 log4j/src/test/java/org/springframework/amqp/rabbit/log4j/web/controller/IntegrationTest.java diff --git a/log4j/pom.xml b/log4j/pom.xml new file mode 100644 index 0000000..7a39825 --- /dev/null +++ b/log4j/pom.xml @@ -0,0 +1,223 @@ + + + 4.0.0 + org.springframework.samples.spring + spring-rabbit-log4j + 1.0.0.BUILD-SNAPSHOT + war + Spring AMQP log4j + http://www.springframework.org + + + + + true + 3.0.5.RELEASE + 1.0.0.BUILD-SNAPSHOT + 1.0.0.M2 + + + + strict + + false + + + + + + + + org.springframework.amqp + spring-amqp + ${spring.amqp.version} + + + org.springframework.amqp + spring-rabbit + ${spring.amqp.version} + + + + org.springframework + spring-test + ${spring.framework.version} + test + + + org.springframework + spring-context-support + ${spring.framework.version} + runtime + + + org.springframework + spring-aop + ${spring.framework.version} + + + org.springframework + spring-oxm + ${spring.framework.version} + + + org.springframework + spring-webmvc + ${spring.framework.version} + + + javax.servlet + servlet-api + 2.5 + provided + + + javax.servlet + jstl + 1.1.2 + runtime + + + standard + taglibs + 1.1.2 + jar + runtime + + + cglib + cglib-nodep + 2.2 + + + aspectj + aspectjrt + 1.5.4 + + + aspectj + aspectjweaver + 1.5.4 + + + + org.codehaus.jackson + jackson-mapper-asl + 1.4.3 + runtime + + + + junit + junit + 4.8.1 + test + + + + log4j + log4j + 1.2.16 + runtime + + + + com.jgoodies + forms + 1.2.1 + + + + + + + + + com.springsource.bundlor + com.springsource.bundlor.maven + 1.0.0.M1B + + + maven-assembly-plugin + false + + + project + + + + + + + + org.mortbay.jetty + maven-jetty-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.5 + 1.5 + + + + org.apache.maven.plugins + maven-surefire-plugin + + + + **/*Tests.java + + + **/Abstract*.java + + + + + + + + + Codehaus + http://repository.codehaus.org/ + + false + + + + + http://www.springframework.org/download + + staging + file:///${user.dir}/target/staging/org.springframework.batch.archetype/${pom.artifactId} + + + spring-release + Spring Release Repository + file:///${user.dir}/target/staging/release + + + spring-snapshot + Spring Snapshot Repository + file:///${user.dir}/target/staging/snapshot + + + + + repository.springframework.maven.milestone + Spring Framework Maven Milestone Repository + http://maven.springframework.org/milestone + + + repository.springframework.maven.snapshot + Spring Framework Maven Snapshot Repository + http://maven.springframework.org/snapshot + + + + \ No newline at end of file diff --git a/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/config/server/RabbitServerConfiguration.java b/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/config/server/RabbitServerConfiguration.java new file mode 100644 index 0000000..2815a1b --- /dev/null +++ b/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/config/server/RabbitServerConfiguration.java @@ -0,0 +1,107 @@ +/* + * Copyright 2002-2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (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.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.springframework.amqp.rabbit.log4j.config.server; + +import org.apache.log4j.Level; +import org.springframework.amqp.core.AmqpAdmin; +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.core.BindingBuilder; +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.core.TopicExchange; +import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; +import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter; +import org.springframework.amqp.rabbit.log4j.converter.AmqpLogMessageConverter; +import org.springframework.amqp.rabbit.log4j.listener.AmqpLogMessageListener; +import org.springframework.amqp.support.converter.MessageConverter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Configuration for Server. + * + * @author Tomas Lukosius + */ +@Configuration +public class RabbitServerConfiguration { + + /** + * Shared topic exchange used for publishing log4j messages (e.g. debug statements) + */ + public static String LOG_EXCHANGE_NAME = "app.log4j.log"; + public static String LOG_QUEUE_NAME = "app.log4j.demo"; + public static String LOG_ALL_INFO_ROUTING_KEY = "#." + Level.INFO.toString(); + + private int port = 5672; + + @Bean + public ConnectionFactory connectionFactory() { + CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost"); + connectionFactory.setUsername("guest"); + connectionFactory.setPassword("guest"); + connectionFactory.setPort(port); + return connectionFactory; + } + + @Bean + public MessageConverter amqpLogMessageConverter() { + return new AmqpLogMessageConverter(); + } + + @Bean + public TopicExchange logExchange() { + return new TopicExchange(LOG_EXCHANGE_NAME, false, false); + } + + /** + * @return the admin bean that can declare queues etc. + */ + @Bean + public AmqpAdmin amqpAdmin() { + RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory()); + rabbitAdmin.setAutoStartup(true); + return rabbitAdmin; + } + + @Bean + public Queue queue() { + return new Queue(LOG_QUEUE_NAME); + } + + @Bean + public Binding binding() { + return BindingBuilder.from(queue()).to(logExchange()).with(LOG_ALL_INFO_ROUTING_KEY); + } + + @Bean + public AmqpLogMessageListener messageListener() { + return new AmqpLogMessageListener(); + } + + @Bean + public SimpleMessageListenerContainer listenerContainer() { + SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); + container.setConnectionFactory(connectionFactory()); + container.setQueueNames(LOG_QUEUE_NAME); + + MessageListenerAdapter listenerAdapter = new MessageListenerAdapter(messageListener(), + new AmqpLogMessageConverter()); + listenerAdapter.setDefaultListenerMethod("handleLog"); + + container.setMessageListener(listenerAdapter); + return container; + } +} diff --git a/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/converter/AmqpLogMessageConverter.java b/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/converter/AmqpLogMessageConverter.java new file mode 100644 index 0000000..2512a4c --- /dev/null +++ b/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/converter/AmqpLogMessageConverter.java @@ -0,0 +1,93 @@ +/* + * Copyright 2002-2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (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.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.springframework.amqp.rabbit.log4j.converter; + +import java.util.Date; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessageProperties; +import org.springframework.amqp.rabbit.log4j.AmqpAppender; +import org.springframework.amqp.rabbit.log4j.web.domain.AmqpLogMessage; +import org.springframework.amqp.support.converter.AbstractMessageConverter; +import org.springframework.amqp.support.converter.MessageConversionException; +import org.springframework.util.CollectionUtils; + +import com.rabbitmq.client.impl.LongStringHelper; + +/** + * @author tomas.lukosius@opencredo.com + * + */ +public class AmqpLogMessageConverter extends AbstractMessageConverter { + private static Log log = LogFactory.getLog(AmqpLogMessageConverter.class); + + /* + * (non-Javadoc) + * + * @see org.springframework.amqp.support.converter.AbstractMessageConverter#createMessage(java.lang.Object, + * org.springframework.amqp.core.MessageProperties) + */ + @Override + protected Message createMessage(Object object, MessageProperties messageProperties) { + throw new UnsupportedOperationException("Conversion from object to amqp logs message not supported"); + } + + /* + * (non-Javadoc) + * + * @see + * org.springframework.amqp.support.converter.AbstractMessageConverter#fromMessage(org.springframework.amqp.core + * .Message) + */ + @Override + public Object fromMessage(Message message) throws MessageConversionException { + AmqpLogMessage content = null; + MessageProperties properties = message.getMessageProperties(); + if (properties != null) { + String applicationId = properties.getAppId(); + Date timestamp = properties.getTimestamp(); + Map headers = properties.getHeaders(); + + if (CollectionUtils.isEmpty(headers)) { + log.warn("Retrieved log message properties should contain headers"); + return null; + } + + if (!headers.containsKey(AmqpAppender.CATEGORY_NAME)) { + log.warn(AmqpAppender.CATEGORY_NAME + " - is expected in log message properties headers"); + return null; + } + + if (!headers.containsKey(AmqpAppender.CATEGORY_LEVEL)) { + log.warn(AmqpAppender.CATEGORY_LEVEL + " - is expected in log message properties headers"); + return null; + } + + String logger = new String( + ((LongStringHelper.ByteArrayLongString) headers.get(AmqpAppender.CATEGORY_NAME)).getBytes()); + String level = new String( + ((LongStringHelper.ByteArrayLongString) headers.get(AmqpAppender.CATEGORY_LEVEL)).getBytes()); + + content = new AmqpLogMessage(logger, level, new String(message.getBody()), timestamp.getTime(), + applicationId); + } else { + log.warn("Retrieved log message should contain properties"); + } + + return content; + } + +} diff --git a/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/listener/AmqpLogMessageListener.java b/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/listener/AmqpLogMessageListener.java new file mode 100644 index 0000000..bb401cd --- /dev/null +++ b/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/listener/AmqpLogMessageListener.java @@ -0,0 +1,51 @@ +/* + * Copyright 2002-2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (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.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.springframework.amqp.rabbit.log4j.listener; + +import java.util.Comparator; +import java.util.Iterator; +import java.util.Queue; +import java.util.concurrent.PriorityBlockingQueue; + +import org.springframework.amqp.rabbit.log4j.web.domain.AmqpLogMessage; + +/** + * @author tomas.lukosius@opencredo.com + * + */ +public class AmqpLogMessageListener { + private Queue logs = new PriorityBlockingQueue(100, new QuoteComparator()); + private long timeout = 30000; // 30 seconds of data + + public void handleLog(AmqpLogMessage message) { + long timestamp = System.currentTimeMillis() - timeout; + for (Iterator iterator = logs.iterator(); iterator.hasNext();) { + AmqpLogMessage quote = iterator.next(); + if (quote.getTimestamp() < timestamp) { + iterator.remove(); + } + } + logs.add(message); + } + + public Queue getLogs() { + return logs; + } + + private static class QuoteComparator implements Comparator { + public int compare(AmqpLogMessage o1, AmqpLogMessage o2) { + return new Long(o1.getTimestamp() - o2.getTimestamp()).intValue(); + } + + } +} diff --git a/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/service/AbstractService.java b/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/service/AbstractService.java new file mode 100644 index 0000000..d373e30 --- /dev/null +++ b/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/service/AbstractService.java @@ -0,0 +1,42 @@ +/* + * Copyright 2002-2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (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.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.springframework.amqp.rabbit.log4j.service; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * @author tomas.lukosius@opencredo.com + * + */ +public class AbstractService { + protected Log logger = LogFactory.getLog(this.getClass()); + + public static String ERROR_MESSAGE = "Simulating failure"; + + public void logInfo(String message) { + logger.info(message); + } + + public void logDebug(String message) { + logger.debug(message); + } + + public void logWarn(String message) { + logger.warn(message); + } + + public void logError(String message) { + logger.error(message, new RuntimeException(ERROR_MESSAGE)); + } +} diff --git a/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/service/ServiceA.java b/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/service/ServiceA.java new file mode 100644 index 0000000..d9eb80d --- /dev/null +++ b/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/service/ServiceA.java @@ -0,0 +1,21 @@ +/* + * Copyright 2002-2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (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.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.springframework.amqp.rabbit.log4j.service; + +/** + * @author tomas.lukosius@opencredo.com + * + */ +public class ServiceA extends AbstractService { + +} diff --git a/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/service/ServiceB.java b/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/service/ServiceB.java new file mode 100644 index 0000000..661afcb --- /dev/null +++ b/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/service/ServiceB.java @@ -0,0 +1,21 @@ +/* + * Copyright 2002-2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (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.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.springframework.amqp.rabbit.log4j.service; + +/** + * @author tomas.lukosius@opencredo.com + * + */ +public class ServiceB extends AbstractService { + +} diff --git a/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/web/controller/AppServiceController.java b/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/web/controller/AppServiceController.java new file mode 100644 index 0000000..7b7bfbd --- /dev/null +++ b/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/web/controller/AppServiceController.java @@ -0,0 +1,169 @@ +/* + * Copyright 2002-2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (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.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.springframework.amqp.rabbit.log4j.web.controller; + +import java.util.Random; + +import org.apache.log4j.Level; +import org.springframework.amqp.rabbit.log4j.service.AbstractService; +import org.springframework.amqp.rabbit.log4j.service.ServiceA; +import org.springframework.amqp.rabbit.log4j.service.ServiceB; +import org.springframework.stereotype.Controller; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * + * @author tomas.lukosius@opencredo.com + * + */ +@Controller +public class AppServiceController { + private static final Random random = new Random(); + + private ServiceA serviceA = new ServiceA(); + private ServiceB serviceB = new ServiceB(); + + @RequestMapping(value = "/logA", params = "level=info") + @ResponseBody + public String logInfoA(@RequestParam("message") String message) { + if (StringUtils.hasText(message)) { + serviceA.logInfo(message); + } + return Level.INFO.toString() + "[" + serviceA.getClass().getSimpleName() + "] - " + message; + } + + @RequestMapping(value = "/logA", params = "level=debug") + @ResponseBody + public String logDebugA(@RequestParam("message") String message) { + if (StringUtils.hasText(message)) { + serviceA.logDebug(message); + } + + return Level.DEBUG.toString() + "[" + serviceA.getClass().getSimpleName() + "] - " + message; + } + + @RequestMapping(value = "/logA", params = "level=warn") + @ResponseBody + public String logWarnA(@RequestParam("message") String message) { + if (StringUtils.hasText(message)) { + serviceA.logWarn(message); + } + return Level.WARN.toString() + " [" + serviceA.getClass().getSimpleName() + "] - " + message; + } + + @RequestMapping(value = "/logA", params = "level=error") + @ResponseBody + public String logErrorA(@RequestParam("message") String message) { + if (StringUtils.hasText(message)) { + serviceA.logError(message); + } + return Level.ERROR.toString() + "[" + serviceA.getClass().getSimpleName() + "] - " + message; + } + + @RequestMapping(value = "/logB", params = "level=info") + @ResponseBody + public String logInfoB(@RequestParam("message") String message) { + if (StringUtils.hasText(message)) { + serviceB.logInfo(message); + } + return Level.INFO.toString() + "[" + serviceB.getClass().getSimpleName() + "] - " + message; + } + + @RequestMapping(value = "/logB", params = "level=debug") + @ResponseBody + public String logDebugB(@RequestParam("message") String message) { + if (StringUtils.hasText(message)) { + serviceB.logDebug(message); + } + return Level.DEBUG.toString() + "[" + serviceB.getClass().getSimpleName() + "] - " + message; + } + + @RequestMapping(value = "/logB", params = "level=warn") + @ResponseBody + public String logWarnB(@RequestParam("message") String message) { + if (StringUtils.hasText(message)) { + serviceB.logWarn(message); + } + return Level.WARN.toString() + "[" + serviceB.getClass().getSimpleName() + "] - " + message; + } + + @RequestMapping(value = "/logB", params = "level=error") + @ResponseBody + public String logErrorB(@RequestParam("message") String message) { + if (StringUtils.hasText(message)) { + serviceB.logError(message); + } + return Level.ERROR.toString() + "[" + serviceB.getClass().getSimpleName() + "] - " + message; + } + + @RequestMapping(value = "/randomLog") + @ResponseBody + public String randomLog(@RequestParam(value = "count", defaultValue = "10") int count) { + if (count <= 0) { + count = 10; + } + AbstractService service; + + int countServiceA = 0; + int countServiceB = 0; + int countInfo = 0; + int countDebug = 0; + int countWarn = 0; + int countError = 0; + + int serviceNo; + int operationNo; + String randomMessage; + for (int i = 0; i < count; i++) { + serviceNo = random.nextInt(2); + operationNo = random.nextInt(4); + if (serviceNo == 0) { + service = serviceA; + countServiceA++; + } else { + service = serviceB; + countServiceB++; + } + + randomMessage = "Random log - " + System.currentTimeMillis(); + switch (operationNo) { + case 0: + // INFO + service.logInfo(randomMessage); + countInfo++; + break; + case 1: + // DEBUG + service.logDebug(randomMessage); + countDebug++; + break; + case 2: + // WARN + service.logWarn(randomMessage); + countWarn++; + break; + case 3: + // ERROR + service.logError(randomMessage); + countError++; + break; + } + } + return String.format("%d random logs [%d for %s, %d for %s]: INFO - %d, DEBUG - %d, WARN - %d, ERROR - %d", count, + countServiceA, serviceA.getClass().getSimpleName(), countServiceB, serviceB.getClass().getSimpleName(), + countInfo, countDebug, countWarn, countError); + } +} diff --git a/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/web/controller/LogsController.java b/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/web/controller/LogsController.java new file mode 100644 index 0000000..5e6eec3 --- /dev/null +++ b/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/web/controller/LogsController.java @@ -0,0 +1,110 @@ +/* + * Copyright 2002-2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (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.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.springframework.amqp.rabbit.log4j.web.controller; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import javax.servlet.http.HttpSession; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.core.BindingBuilder; +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.core.TopicExchange; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.amqp.rabbit.log4j.config.server.RabbitServerConfiguration; +import org.springframework.amqp.rabbit.log4j.listener.AmqpLogMessageListener; +import org.springframework.amqp.rabbit.log4j.web.domain.AmqpLogMessage; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @author tomas.lukosius@opencredo.com + * + */ +@Controller +public class LogsController implements DisposableBean { + protected Log logger = LogFactory.getLog(this.getClass()); + + private static final String CURRENT_LOG_QUEUE = "CURRENT_LOG_QUEUE"; + private static final String CURRENT_ROUTINGKEY = "CURRENT_ROUTINGKEY"; + + + @Autowired + private TopicExchange exchange; + + @Autowired + private Queue logQueue; + + @Autowired + private RabbitAdmin admin; + + @Autowired + private Binding binding; + + @Autowired + private AmqpLogMessageListener messageListener; + + @RequestMapping("/logs") + @ResponseBody + public List logs(@RequestParam(required = false) Long timestamp, HttpSession session) { + session.setAttribute(CURRENT_LOG_QUEUE, RabbitServerConfiguration.LOG_QUEUE_NAME); + session.setAttribute(CURRENT_ROUTINGKEY, binding.getRoutingKey()); + + if (timestamp == null) { + timestamp = 0L; + } + ArrayList list = new ArrayList(); + for (AmqpLogMessage log : messageListener.getLogs()) { + if (log.getTimestamp() > timestamp) { + list.add(log); + } + } + Collections.reverse(list); + return list; + } + + @RequestMapping("/bindQueue") + @ResponseBody + public String addQueue(@RequestParam(required = true, value = "routingkey") String routingKey, HttpSession session) { + if (!StringUtils.hasText(routingKey)) { + return "Routing key expected"; + } + + try { + admin.removeBinding(binding); + binding = BindingBuilder.from(logQueue).to(exchange).with(routingKey); + admin.declareBinding(binding); + } catch (RuntimeException e) { + logger.error("Failed to declare queue or bind it with exchage", e); + return e.getMessage(); + } + + session.setAttribute(CURRENT_LOG_QUEUE, RabbitServerConfiguration.LOG_QUEUE_NAME); + session.setAttribute(CURRENT_ROUTINGKEY, binding.getRoutingKey()); + + return "Queue '" + logQueue.getName() + "' was binded with routing key '" + routingKey + "'"; + } + + public void destroy() throws Exception { + admin.removeBinding(binding); + } +} diff --git a/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/web/domain/AmqpLogMessage.java b/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/web/domain/AmqpLogMessage.java new file mode 100644 index 0000000..e76e052 --- /dev/null +++ b/log4j/src/main/java/org/springframework/amqp/rabbit/log4j/web/domain/AmqpLogMessage.java @@ -0,0 +1,68 @@ +/* + * Copyright 2002-2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (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.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.springframework.amqp.rabbit.log4j.web.domain; + +import java.text.DateFormat; +import java.util.Date; + +/** + * @author tomas.lukosius@opencredo.com + * + */ +public class AmqpLogMessage { + private String logger; + private String level; + private String message; + private long timestamp; + private String applicationId; + + private DateFormat format = DateFormat.getTimeInstance(); + + public AmqpLogMessage(String logger, String level, String message, long timestamp, String applicationId) { + super(); + this.logger = logger; + this.level = level; + this.message = message; + this.timestamp = timestamp; + this.applicationId = applicationId; + } + + public String getLogger() { + return logger; + } + + public String getLevel() { + return level; + } + + public String getMessage() { + return message; + } + + public long getTimestamp() { + return timestamp; + } + + public String getApplicationId() { + return applicationId; + } + + public String getTimeString() { + return format.format(new Date(timestamp)); + } + + @Override + public String toString() { + return "Amqp log: " + logger + ":" + level + " " + message; + } +} diff --git a/log4j/src/main/resources/log4j.properties b/log4j/src/main/resources/log4j.properties new file mode 100644 index 0000000..ee0094a --- /dev/null +++ b/log4j/src/main/resources/log4j.properties @@ -0,0 +1,54 @@ +log4j.rootCategory=INFO, stdout + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout + +log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n +#log4j.appender.stdout.layout.ConversionPattern=%-5p %8t [%40.40c{4}]: %m%n + +log4j.category.org.springframework.amqp.rabbit.log4j=DEBUG +log4j.category.org.springframework.amqp.rabbit=INFO +log4j.category.org.springframework.beans.factory=INFO + +# AMQP log4j appender for application A + +log4j.appender.amqp=org.springframework.amqp.rabbit.log4j.AmqpAppender +log4j.appender.amqp.layout=org.apache.log4j.PatternLayout +log4j.appender.amqp.layout.ConversionPattern=%d %p %t [%c] - <%m> + +#------------------------------- +## Connection settings +#------------------------------- +log4j.appender.amqp.host=localhost +log4j.appender.amqp.port=5672 +log4j.appender.amqp.username=guest +log4j.appender.amqp.password=guest +log4j.appender.amqp.virtualHost=/ +#log4j.appender.amqp.connectionTimeout=0 # No setter for connection timeout. +#------------------------------- +## Exchange name and type +#------------------------------- +log4j.appender.amqp.exchangeName=app.log4j.log +log4j.appender.amqp.exchangeType=topic +#------------------------------- +## Log4J-format pattern to use to create a routing key. +## The application id is available as %X{applicationId}. +#------------------------------- +log4j.appender.amqp.routingKeyPattern=%c.%p +#------------------------------- +## Whether or not to declare this configured exchange +#------------------------------- +log4j.appender.amqp.declareExchange=false +#------------------------------- +## Message properties +#------------------------------- +log4j.appender.amqp.contentType=text/plain +log4j.appender.amqp.contentEncoding=null +#------------------------------- +## Sender configuration +#------------------------------- +log4j.appender.amqp.senderPoolSize=2 +log4j.appender.amqp.maxSenderRetries=30 +log4j.appender.amqp.applicationId=log4j-sample-A + +log4j.category.org.springframework.amqp.rabbit.log4j=DEBUG, amqp diff --git a/log4j/src/main/resources/server-bootstrap-config.xml b/log4j/src/main/resources/server-bootstrap-config.xml new file mode 100644 index 0000000..0ea3449 --- /dev/null +++ b/log4j/src/main/resources/server-bootstrap-config.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/log4j/src/main/resources/servlet-config.xml b/log4j/src/main/resources/servlet-config.xml new file mode 100644 index 0000000..12bc081 --- /dev/null +++ b/log4j/src/main/resources/servlet-config.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/log4j/src/main/resources/static/css/colors.css b/log4j/src/main/resources/static/css/colors.css new file mode 100644 index 0000000..f205c92 --- /dev/null +++ b/log4j/src/main/resources/static/css/colors.css @@ -0,0 +1,203 @@ +/* colors.css 2008/04/22 nicolekonicki */ + +/* + * COLORS CSS + * + * Only css that affects the colors and text decoration of elements + * should be included here. + * + */ + + +/* + * COMMON STYLES + */ + + body + { + background-color: #dfdfdf; + } + + #page + { + color: #333; + } + + +/* + * HEADER STYLES + */ + + #site-name a, #site-name a:hover + { + color: #fff; + } + + #company-name a + { + color:#fff; + } + + +/* + * TEXT FORMATTING STYLES + */ + +h1 { + color: #007c00; + border-bottom: 1px solid #007c00; +} + +h2 { + color: #333; +} + +h3 { + color: #333; +} + +h4 { + color: #333; +} + + +/* + * LINK STYLES + */ + + a:link, + a:visited + { + color: #333; + text-decoration: underline; + } + + a:hover, + a:focus + { + color: #60aa00; + text-decoration: underline; + } + + a:active, + a.active + { + color: #60aa00; + } + +/* + * MENU STYLES + */ + + #primary-left + { + color: #edf2ce; + } + + #primary-left a, #primary-right a + { + color: #edf2ce; + text-decoration:none; + } + + #primary-left a:hover, #primary-right a:hover + { + color:#fff; + text-decoration: none; + } + + + #secondary-navigation + { + background: #fff; + } + + #secondary-navigation li a + { + color:#595959; + border-bottom:1px solid #e4e3e3; + } + + #secondary-navigation a:hover + { + color: #60aa00; + text-decoration: underline; + } + + #secondary-navigation a.active + { + font-weight: bold; + } + + +/* + * CONTAINER STYLES + */ + + #container + { + background:#fff; + } + + +/* + * TABLE STYLES + */ + + table + { + color:#666; + } + + .bordered-table + { + border:1px solid #b8c885; + } + + th + { + color:#333; + } + + .bordered-table th + { + border-bottom: 1px solid #b8c885; + } + + .sublevel1-odd { + background:#f8faf0; + } + + .sublevel1-even { + background:#fff; + } + + .name-sublevel1-odd { + background:#f8faf0; + } + + .name-sublevel1-even { + background:#fff; + } + + +/* + * FOOTER STYLES + */ + + + #footer-left, #footer-right + { + color: #999; + } + + #footer-left a, #footer-right a + { + color: #999; + text-decoration:none; + } + + + + + diff --git a/log4j/src/main/resources/static/css/local.css b/log4j/src/main/resources/static/css/local.css new file mode 100644 index 0000000..9aaede9 --- /dev/null +++ b/log4j/src/main/resources/static/css/local.css @@ -0,0 +1,198 @@ + +.note { + border: 1px solid #FFDDBB; + color: inherit; + background-color: #FFF5EE; +} + +div.note { + padding: 0.5em; + margin-top: 1.5em; +} + +fieldset { + border-width: 0; + margin: 0; + padding: 0; +} + +.inline-labeles label { + margin-left: 0.5em; +} + +#secondary-navigation ul { + padding-top: 6px; +} + +#exports #export-fragment { + width: 50%; + float: right; + padding-bottom: 22px; +} + +.loading_indicator_parent { + position: relative; +} + +#loading_indicator { + position: absolute; + bottom: 5px; + right: 0; + opacity: 0; +} + +textarea { + display: inline; + width: 40%; + height: 2em; +} + +fieldset > div { + margin-top: 0.5em; +} + +.error { + color: red; + backround-color: inherit; + font-weight: bold; +} + +hr { + height: 1px; + border: 0; + background-color: #007C00; + color: #007C00; +} + +#secondary-navigation { + margin-top: 15px; +} + +#secondary-navigation ul li { + margin-bottom: 5px; +} + +#secondary-navigation ul li li { + margin-bottom: 0; +} + +.scroll { + overflow: auto; + border: 1px solid green; + padding: 3px; + height: 200px; + white-space: pre; +} + +.clear { + clear: both; +} + +input#cancel { + position: absolute; + top: 0; + right: 0; +} + + + + + + + +form > fieldset { + border: 0 + padding: 4px; + padding-bottom: 8px; + margin: 0 0 10px; +} + +legend { + margin-bottom: 0.25em; + margin-left: 0.25em; +} + +form, legend { + border: 0; + padding: 0; + margin: 0; +} + +form ol, form ul { + list-style: none; + margin: 0; + padding: 0; +} + +form li { + clear: both; + margin: 0 0 .75em; + padding: 0; +} + +.confirm { + margin-bottom: 0.75em; +} + +label { + display: block; + float: left; + margin-right: 10px; + text-align: right; + width: 120px; +} + +label:after { + content: ':'; +} + +.radio label:after, +.confirm label:after { + content: ''; +} + +.confirm label { + display: block; + float: none; + margin-left: 130px; + text-align: left; + width: inherit; +} + +fieldset.smalltab .confirm label { + margin-left: 35px; +} + +form .control { + float: left; + margin-bottom: 8px; +} + +input[type="text"], +input[type="password"] +{ + width: 250px; +} + +fieldset .buttonGroup { + clear: both; + margin-left: 130px; + margin-right: 5px; + cursor: pointer; + position: relative; +} + +fieldset.notab .buttonGroup { + margin-left: 0; +} + +fieldset.smalltab .buttonGroup { + margin-left: 35px; +} + +.buttonGroup button, +.buttonGroup input[type="button"], +.buttonGroup input[type="submit"], +.buttonGroup input[type="reset"] { + margin-right: 5px; +} diff --git a/log4j/src/main/resources/static/css/main.css b/log4j/src/main/resources/static/css/main.css new file mode 100644 index 0000000..7ebab31 --- /dev/null +++ b/log4j/src/main/resources/static/css/main.css @@ -0,0 +1,421 @@ +/* main.css 2008/04/22 nicolekonicki */ + +/* + * MAIN CSS + * + * All css for the screen, other than color-specific styles, + * should be included here. Color styles should be included + * in colors.css. + * + */ + +/* + * COMMON STYLES + */ + + body + { + font: 12px Arial, Helvetica, "Bitstream Vera Sans", sans-serif; + } + + #page + { + margin:8px; + } + + + + +/* + * HEADER STYLES + */ + + #header + { + background: #6c940b url(../images/header-stretch.png); + width: 100%; + height: 72px; + } + + #name-and-company + { + background: url(../images/header-left.png) top left no-repeat; + width: 100%; + height: 72px; + position:relative; + top:0px; + left:0px; + } + + #site-name + { + margin: 0; + display: inline; + font-size: 150%; + } + + #site-name a, #site-name a:hover + { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-weight: bold; + position:absolute; + top:30px; + left:16px; + text-decoration:none; + } + + #company-name a + { + position:absolute; + right:0px; + background: url(../images/header-right.png) top right no-repeat; + height:72px; + width:190px; + font-size:8px; + text-align: center; + } + + +/* + * TEXT FORMATTING STYLES + */ + +h1 { + font-size: 1.4em; + padding:12px 0 5px 0; + line-height:125%; +} + +h2 { + font-size: 1.2em; + padding:10px 0 2px 0; +} + +h3 { + font-size: 1em; + padding:8px 0 5px 0; +} + +h4 { + font-size: 1em; + padding-top:8px; +} + + + +/* + * MENU STYLES + */ + + #primary-navigation + { + padding: 0; + background: url(../images/primary-menu-stretch.png) repeat-x; + height:23px; + position:relative; + margin: 8px 0 0 0; + } + + #primary-left + { + background-image: url(../images/primary-wrapper-left.png); + background-repeat:no-repeat; + background-position:top left; + font-size: 93%; + line-height: normal; + padding: 0 0 0 8px; + height:23px; + position:relative; + float:left; + } + + #primary-right + { + background-image: url(../images/primary-wrapper-right.png); + background-repeat:no-repeat; + background-position:top right; + font-size: 93%; + line-height: normal; + padding: 0 8px 0 0; + height:23px; + position:relative; + float:right; + } + + #primary-left ul, #primary-right ul + { + padding: 0 0 0 5px; + margin: 0; + list-style: none; + } + + #primary-left li, #primary-right li + { + display:inline; + } + + + #primary-left a, #primary-right a + { + font-weight: normal; + display: block; + float: left; + padding: 5px 14px 5px 14px; + margin: 0px 1px 0 0; + background-position: 0% 0; + background-image: url(../images/primary-item-background.png); + background-repeat: repeat-x; + } + + #primary-left a:hover, #primary-right a:hover + { + background-image:none; + } + + + #secondary-navigation + { + width:212px; + height:100%; + margin-left:16px; + float:left; + } + + #secondary-navigation ul + { + margin: 0; + padding: 12px 0 0 0; + list-style: none; + } + + #secondary-navigation li a + { + display: block; + text-decoration: none; + padding: 6px 5px; + } + + #secondary-navigation ul ul + { + margin: 0; + padding: 0 0 0 12px; + list-style: none; + } + + #content + { + display:block; + margin:10px 16px 0 244px; + padding-bottom:20px; + } + + #content.no-side-nav + { + margin-left: 10px; + } + +/* + * CONTAINER STYLES + */ + + #container + { + margin: 0; + padding-bottom:20px; + overflow:hidden; + } + +/* + * TABLE STYLES + */ + + table + { + border-spacing:0; + margin:0; + border-collapse:collapse; + } + + th + { + height:19px; + text-align:left; + font-weight:bold; + margin:0; + padding:3px 6px 0 6px; + line-height:19px; + } + + .bordered-table th + { + background-image: url(../images/table-header-background.png); + background-repeat: repeat-x; + } + + td + { + margin:0; + padding:4px 6px; + vertical-align:top; + } + + th.table-meta-data + { + text-align: right; + vertical-center; + } + +.name-sublevel1-odd + { + padding-left:20px; + font-weight:bold; + } + + .name-sublevel1-even + { + padding-left:20px; + font-weight:bold; + } + + .two-tables + { + width:100%; + } + + .two-tables .left + { + float:left; + } + + .two-tables .right + { + float:right; + } + +.controlLinks { + line-height: 1em; + list-style-image: none; + list-style-position: outside; + list-style-type: none; + margin: 0 0 1.5em; + padding: 0; + width: 100%; +} + +.controlLinks li { + display: inline; + line-height: 1em; + list-style-image: none; + list-style-position: outside; + list-style-type: none; + margin: 0; + padding: 10px 10px 10px 0; +} + +/* + * FORM STYLES + */ + + input, textarea, textfield + { + margin: 0; + font-family: Arial, Helvetica, "Bitstream Vera Sans", sans-serif; + padding: 1px; + font-size: 100%; + } + + input.small + { + font-size: 80%; + width: 3em; + padding: 0px; + } + + input.form-checkbox, input.form-radio + { + border: none; + } + +#search .form-text, #user-login-form .form-text + { + padding: 2px; + } + + .form-submit, .button + { + padding: 1px; + } + + #user-login-form + { + text-align: left; + } + + #user-login-form .item-list ul + { + margin-top: 10px; + } + +/* + * ALERTS, STATUS, HELP MESSAGE STYLES + */ + + .messages + { + padding: 1.3em 1em .3em 52px; + margin: 10px 0; + } + + .messages ul + { + padding: 0 0 0 20px; + margin: 0; + } + +/* + * FOOTER STYLES + */ + + #footer-wrapper + { + clear:both; + margin: 0; + background-image: url(../images/footer-stretch.png); + background-repeat:repeat-x; + height: 29px; + width:100%; + } + + #footer-left, #footer-right + { + margin: 0; + font-size: 85%; + padding: 1em; + height:29px; + } + + + #footer-left + { + text-align:left; + background-image: url(../images/footer-left.png); + background-repeat:no-repeat; + position:relative; + left:0; + float:left; + } + + #footer-right + { + text-align:right; + background-image: url(../images/footer-right.png); + background-repeat:no-repeat; + background-position:top right; + position:relative; + right:0; + float:right; + } + + + + diff --git a/log4j/src/main/resources/static/images/ajax-loader.gif b/log4j/src/main/resources/static/images/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..2a863d57197d71167ed5c1a50c7ee3fea74b6b35 GIT binary patch literal 2545 zcma*pTTl~O8VB%0-@DV@bVMCw+1b!(B#Gbz0xqIL6cUK&2;#ta2L-vPTomQH8c2XZ z67Cm4&~Q`;B`G&0S(cZc zna|`Do0eV3us}{i8lx-~aZuM(Ny?M$O8@R%} z+Ukn0ZFFOZsneF1Q6LGxot+`|Ec?a~p`O;8r(BYD6f!Zn7*lSkvQ?LuTi|0YJVv9*hj+G7C`z{}bDOaOCqjpC%B@a z2w*qL)nXY1*8?GFGTe70uzNI1p4ll}|6=O&M8&*_F(<+( zb0S)Wo`Bx&I^tE1&Gz-r9M75dq)1 za^-}JteW_=N1^%srAhgMf_j=p6LXDFyy)r$3D5M+sNMeNMw1TcK=MhB8_zZqtWyaD>;9SPX%)ta`x z*U&i2;xr>xhN`x{(Q@i^S}PA%8I|INg-^|EjEIWApWMBQCkzu#Qm|4H`rmts{7X@+glYB|Q>Ef_V-b=yI$XHdK@sCYP zIK^lV%rDp*Mvyp85=;eFsS#_VthJSCl;;(!m#_!CnJgnL5_fIivs+EZ)2{56?dpT= zfRVZih$+wkuuxpenSJ870ZPjDB6}YKPCBYF-4Q--yWZhFZ>G*WA&KrOZER0hZEpx0 zp`mU?sjv7hKo$d^47K}>SQB@+5}`{sC<3B3_PW3>ZjUqM@S@q7%7ta?Z1j#zOXfaG zPdsvtL(A7}^{~A&>f$%7F?{G$j0r0Xt*Eq?G&M1`hmROgT#~TPqI36*NO7XmcL8o9g&?!iI zFQB>UG~$YFWVGENtDPi1F-G@rLW18*Qq3t6HSG_;!msoQ_UgsN8apwRy-(}m0%3ps z=f}BoKgM?3|8#euvpG>k`;MuMrRD;=Jx&E5OjXh(*O-!dL~OviUE6k%sTit-B;@`) zSE*vpQk?Y5lXFs>$FBkjPUN%F1i-R9c0HF8^Y(?Dz#F|k6YeKo$sNj?*YG}0|1}JR zu!w5G^mA^A{?@jZWup+;e`B- zoI0yNFTX3t+Cqo*^9qLlH%|ZWD*CXh__w*yY-Fhg4hZ-Gz~5K@x-^2X8SI}Elx&@O zXs#*N{^Rwkoa|thE?^E|jCdEN<`sqZyZ|^uj!1A+k3f`-C&XH>_og5y9yv{f)9nnj z^UR7Q0qq1-EKK)@1VH2tK$ifB*6Agr0c}}2m5-5w{DX!8eV{PA(=H#&pO-Q6AI3Ho zN_Q6rkoAZi@pld&)s}VQ08$ku6%KLZ?Z}olQH2pPKKy~#u)@=|+ILr&I Kat=`M*S`UWP7FT) literal 0 HcmV?d00001 diff --git a/log4j/src/main/resources/static/images/delete.png b/log4j/src/main/resources/static/images/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..84a31891445b8c4166c0bd3c67f5aab226fc7c96 GIT binary patch literal 431 zcmV;g0Z{&lP)O2tN&fyj;%I5oI`2^8f?m)Gt5RiaVai0Du6%{q}YuW?6d!%PaX< zdMqt}+6bQ>0}gd^>8>2EUp+JoFPAfI$2mx5SN8`}i6Iq~jo43UIOA?Y37HKW-*U@J zToXNtGS1>`-tN~7dV2%WX+bIp1%=^}l+m#J^PObAaB4dJTzgv}j4|-fPmp#U5D}!5001QfA{s$(0f;ULi+ZImzZ{HCj?d7e0tDqy z3Xqxxb8ZpUx2J%kTQW8*r*7K%5Db!yyD44vdXU6K-{cG`VNJXTenGXXXU5sbhuED+ z-Zfj_l6E`Ox|_0D+!8Mp|Fv563r*TO+%3|M_8)$_v}D>zn&CR;1!JI!`+e<7amND# ZfL~v=x}9iadqDsI002ovPDHLkV1lX3y3qgt literal 0 HcmV?d00001 diff --git a/log4j/src/main/resources/static/images/favicon.ico b/log4j/src/main/resources/static/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..194a8c98049b2ee011c7c0ed7cf501afe97671d4 GIT binary patch literal 367958 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

bVeE6N$FdR~sT+SVH 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 Rr?>zB002ovPDHLkV1izVP+tH5 literal 0 HcmV?d00001 diff --git a/log4j/src/main/resources/static/images/footer-right.png b/log4j/src/main/resources/static/images/footer-right.png new file mode 100644 index 0000000000000000000000000000000000000000..7d23d4d728e24cfd51ddcf089180f9b4adfc961f GIT binary patch literal 2865 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 PWPp^Iyl9oMLE!%YzY3En literal 0 HcmV?d00001 diff --git a/log4j/src/main/resources/static/images/header-stretch.png b/log4j/src/main/resources/static/images/header-stretch.png new file mode 100644 index 0000000000000000000000000000000000000000..ba6d60511934eeb707fbef9674c415340699c82e GIT binary patch literal 2884 zcmV-K3%m4*P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0001QNkl8@ftw+sHS+&A9H$!)V6Mn3;Xwhi?(f i4J?&1hkC~!Tmt}+l?eo@Lon?C0000$XgYMs^AIOw1Qr{*Wn)N-{9ma}x2(<~`9Go1=*>YR!KZvrBS zCd!u}@M0og%Ev@_;Z?Kk>Wwv=%h_57zmt2<_1msz_niYE=YRNPpd%02TK9oK1z z>ooPno}v^sikz_|1XHFx_L%~;ljh7i(jiay5F0x*+(9aXXFCl?AdQj5XlQ65%sEv+ ztfe?|YcjPN*@yYtE~ImQh{l|#A6Z8iu>pf43Rj52CzU_dMQm|S2xR62YjQOn+z8WH zaK=!}ggOZi{4pB7SQ=xC0n|vXP_Bkx_a)FeNd}w8U97BNbSWxa^QW-li9BZ#M1!_xE*?wzt^GcoeoL*JGLSe_+l-JT2#2tz!z&^ z_s5anq&^nBklIMwRvcoP3%qs%%Ea?1c{_*V*Xj&~uLu-2Dp1fUN4<0zMo$EH>*U83 zm_9;Vt%-bE{_J_!If!1y=c+`QVZ>0_BPy z+%^pgnv`f8H)Z%0&Tp8&u*MCIC4igNW5MeWM_DHpDNi)Zxz|9XboOnitwFq$ETN=X zj-tkCJnz**Y4k#6_Ty^B=hWo~L!47r`HoP=x&3T1)JLr2t2+#fHKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0001@Nkl46GC_a*wm;^jPU~C zIskyRwoK_whI8(ys_UT?*4hP_(PG1@U0EKru#11?kC^0`QbJ0p3se=VdLucS>Ie5C ha&GLKbY literal 0 HcmV?d00001 diff --git a/log4j/src/main/resources/static/images/powered-by-spring.png b/log4j/src/main/resources/static/images/powered-by-spring.png new file mode 100644 index 0000000000000000000000000000000000000000..e773b170ade16615b0a0c9b79099f5bb8477d396 GIT binary patch literal 6591 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 literal 0 HcmV?d00001 diff --git a/log4j/src/main/resources/static/images/primary-item-background.png b/log4j/src/main/resources/static/images/primary-item-background.png new file mode 100644 index 0000000000000000000000000000000000000000..ca0ce3b922763cd3cbcfa60a712bea09898fc0e1 GIT binary patch literal 2908 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 KMNUMnLSTY8g=RAV literal 0 HcmV?d00001 diff --git a/log4j/src/main/resources/static/images/primary-wrapper-left.png b/log4j/src/main/resources/static/images/primary-wrapper-left.png new file mode 100644 index 0000000000000000000000000000000000000000..68ad270d55bfe3b0474501c8bee111af69b6bd01 GIT binary patch literal 3037 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 literal 0 HcmV?d00001 diff --git a/log4j/src/main/resources/static/images/primary-wrapper-right.png b/log4j/src/main/resources/static/images/primary-wrapper-right.png new file mode 100644 index 0000000000000000000000000000000000000000..1e18d5810ed6c72f82e990bde3741a1bdb17a39c GIT binary patch literal 3059 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 BpD+Lb literal 0 HcmV?d00001 diff --git a/log4j/src/main/resources/static/images/springsource_logo.png b/log4j/src/main/resources/static/images/springsource_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d1b8888a74522dc9db8ebc1a438fc6547f0f0a96 GIT binary patch literal 9310 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∓Z(`gDM8?Nn{n#)MEmlqI!MQ0v3QcAvbKLV!GuFq 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 E4=4rD8UO$Q literal 0 HcmV?d00001 diff --git a/log4j/src/main/resources/static/images/table-header-background.png b/log4j/src/main/resources/static/images/table-header-background.png new file mode 100644 index 0000000000000000000000000000000000000000..5566c8dee6547f627c29d8b38beb8ecd57d86d1f GIT binary patch literal 2852 zcmV+<3)}RGP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0000_Nkl>%qjm!+W zJKAB$El@;!H#0xxoT!w7dhe*UhH9<<8e<^fx`7I;J! zGca%qgD@k*tT_@uLG}_)Usv`UoN}VdMvwm(x&no4JzX3_DsIJ|*vNapfai$AtFKY| zi&M4MFNxAiVsV_s?D4L&cZTELS_LLnh1>00CK?Csv&pQFzj-2*x`7I;J! zGca%qgD@k*tT_@uLG}_)Usv`UoN}Tns``0Ku0SD2PZ!6Kid(j)Hu5$z2(TQyI@Lck zuj7o0{$IJqgC|`MKev%;=!rLqOG%T<@tnFwsJ!#nCDpY@bT3Z&c7FYo3zL}4nYpb` Umxcv;0S#mDboFyt=akR{07P~-T>t<8 literal 0 HcmV?d00001 diff --git a/log4j/src/main/resources/static/js/jquery.min.js b/log4j/src/main/resources/static/js/jquery.min.js new file mode 100644 index 0000000..c2dcfe7 --- /dev/null +++ b/log4j/src/main/resources/static/js/jquery.min.js @@ -0,0 +1,167 @@ +/*! + * jQuery JavaScript Library v1.4.4 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Nov 11 19:04:53 2010 -0500 + */ +(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h= +h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;kd)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La, +"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this, +e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a, +"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+ +a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/, +C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j, +s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this, +j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length}, +toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j=== +-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false; +if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload", +b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&& +!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&& +l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H
a";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"), +k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false, +scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent= +false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom= +1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="

";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="
t
";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display= +"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h= +c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando); +else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one"; +if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true}, +attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&& +b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0}; +c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem, +arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid= +d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+ +c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType=== +8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k=== +"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+ +d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired= +B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type=== +"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]=== +0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}}); +(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3]; +break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr, +q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h= +l;g.sort(w);if(h)for(var i=1;i0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n, +m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled=== +true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"=== +g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return in[3]-0},nth:function(g,i,n){return n[3]- +0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()=== +i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]]; +if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m, +g);else if(typeof g.length==="number")for(var p=g.length;n";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g); +n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&& +function(){var g=k,i=t.createElement("div");i.innerHTML="

";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F|| +p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g= +t.createElement("div");g.innerHTML="
";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition? +function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n0)for(var h=d;h0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h= +h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context): +c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a, +2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a, +b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&& +e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/\s]+\/)>/g,P={option:[1, +""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div
","
"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= +c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, +wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, +prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, +this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); +return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null; +else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1>");try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append", +prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument|| +b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]===""&&!x?r.childNodes:[];for(o=k.length- +1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script")))); +d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i, +jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true, +zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b), +h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b); +if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f= +d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left; +e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/)<[^<]*)*<\/script>/gi, +ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b=== +"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("
").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&& +!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})}, +getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html", +script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data|| +!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache= +false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset; +A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type", +b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&& +c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d|| +c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]= +encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess", +[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"), +e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}}); +if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show", +3),a,b,d);else{d=0;for(var e=this.length;d=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b, +d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a* +Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)} +var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true; +this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide|| +this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a= +c.timers,b=0;b-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a, +e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&& +c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase(); +c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+ +b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window); diff --git a/log4j/src/main/resources/static/js/jquery.mustache.js b/log4j/src/main/resources/static/js/jquery.mustache.js new file mode 100644 index 0000000..45cbff0 --- /dev/null +++ b/log4j/src/main/resources/static/js/jquery.mustache.js @@ -0,0 +1,340 @@ +/* +Shameless port of a shameless port +@defunkt => @janl => @aq + +See http://github.com/defunkt/mustache for more info. +*/ + +;(function($) { + +/* + mustache.js — Logic-less templates in JavaScript + + See http://mustache.github.com/ for more info. +*/ + +var Mustache = function() { + var Renderer = function() {}; + + Renderer.prototype = { + otag: "{{", + ctag: "}}", + pragmas: {}, + buffer: [], + pragmas_implemented: { + "IMPLICIT-ITERATOR": true + }, + context: {}, + + render: function(template, context, partials, in_recursion) { + // reset buffer & set context + if(!in_recursion) { + this.context = context; + this.buffer = []; // TODO: make this non-lazy + } + + // fail fast + if(!this.includes("", template)) { + if(in_recursion) { + return template; + } else { + this.send(template); + return; + } + } + + template = this.render_pragmas(template); + var html = this.render_section(template, context, partials); + if(in_recursion) { + return this.render_tags(html, context, partials, in_recursion); + } + + this.render_tags(html, context, partials, in_recursion); + }, + + /* + Sends parsed lines + */ + send: function(line) { + if(line != "") { + this.buffer.push(line); + } + }, + + /* + Looks for %PRAGMAS + */ + render_pragmas: function(template) { + // no pragmas + if(!this.includes("%", template)) { + return template; + } + + var that = this; + var regex = new RegExp(this.otag + "%([\\w-]+) ?([\\w]+=[\\w]+)?" + + this.ctag); + return template.replace(regex, function(match, pragma, options) { + if(!that.pragmas_implemented[pragma]) { + throw({message: + "This implementation of mustache doesn't understand the '" + + pragma + "' pragma"}); + } + that.pragmas[pragma] = {}; + if(options) { + var opts = options.split("="); + that.pragmas[pragma][opts[0]] = opts[1]; + } + return ""; + // ignore unknown pragmas silently + }); + }, + + /* + Tries to find a partial in the curent scope and render it + */ + render_partial: function(name, context, partials) { + name = this.trim(name); + if(!partials || partials[name] === undefined) { + throw({message: "unknown_partial '" + name + "'"}); + } + if(typeof(context[name]) != "object") { + return this.render(partials[name], context, partials, true); + } + return this.render(partials[name], context[name], partials, true); + }, + + /* + Renders inverted (^) and normal (#) sections + */ + render_section: function(template, context, partials) { + if(!this.includes("#", template) && !this.includes("^", template)) { + return template; + } + + var that = this; + // CSW - Added "+?" so it finds the tighest bound, not the widest + var regex = new RegExp(this.otag + "(\\^|\\#)\\s*(.+)\\s*" + this.ctag + + "\n*([\\s\\S]+?)" + this.otag + "\\/\\s*\\2\\s*" + this.ctag + + "\\s*", "mg"); + + // for each {{#foo}}{{/foo}} section do... + return template.replace(regex, function(match, type, name, content) { + var value = that.find(name, context); + if(type == "^") { // inverted section + if(!value || that.is_array(value) && value.length === 0) { + // false or empty list, render it + return that.render(content, context, partials, true); + } else { + return ""; + } + } else if(type == "#") { // normal section + if(that.is_array(value)) { // Enumerable, Let's loop! + return that.map(value, function(row) { + return that.render(content, that.create_context(row), + partials, true); + }).join(""); + } else if(that.is_object(value)) { // Object, Use it as subcontext! + return that.render(content, that.create_context(value), + partials, true); + } else if(typeof value === "function") { + // higher order section + return value.call(context, content, function(text) { + return that.render(text, context, partials, true); + }); + } else if(value) { // boolean section + return that.render(content, context, partials, true); + } else { + return ""; + } + } + }); + }, + + /* + Replace {{foo}} and friends with values from our view + */ + render_tags: function(template, context, partials, in_recursion) { + // tit for tat + var that = this; + + var new_regex = function() { + return new RegExp(that.otag + "(=|!|>|\\{|%)?([^\\/#\\^]+?)\\1?" + + that.ctag + "+", "g"); + }; + + var regex = new_regex(); + var tag_replace_callback = function(match, operator, name) { + switch(operator) { + case "!": // ignore comments + return ""; + case "=": // set new delimiters, rebuild the replace regexp + that.set_delimiters(name); + regex = new_regex(); + return ""; + case ">": // render partial + return that.render_partial(name, context, partials); + case "{": // the triple mustache is unescaped + return that.find(name, context); + default: // escape the value + return that.escape(that.find(name, context)); + } + }; + var lines = template.split("\n"); + for(var i = 0; i < lines.length; i++) { + lines[i] = lines[i].replace(regex, tag_replace_callback, this); + if(!in_recursion) { + this.send(lines[i]); + } + } + + if(in_recursion) { + return lines.join("\n"); + } + }, + + set_delimiters: function(delimiters) { + var dels = delimiters.split(" "); + this.otag = this.escape_regex(dels[0]); + this.ctag = this.escape_regex(dels[1]); + }, + + escape_regex: function(text) { + // thank you Simon Willison + if(!arguments.callee.sRE) { + var specials = [ + '/', '.', '*', '+', '?', '|', + '(', ')', '[', ']', '{', '}', '\\' + ]; + arguments.callee.sRE = new RegExp( + '(\\' + specials.join('|\\') + ')', 'g' + ); + } + return text.replace(arguments.callee.sRE, '\\$1'); + }, + + /* + find `name` in current `context`. That is find me a value + from the view object + */ + find: function(name, context) { + name = this.trim(name); + + // Checks whether a value is thruthy or false or 0 + function is_kinda_truthy(bool) { + return bool === false || bool === 0 || bool; + } + + var value; + if(is_kinda_truthy(context[name])) { + value = context[name]; + } else if(is_kinda_truthy(this.context[name])) { + value = this.context[name]; + } + + if(typeof value === "function") { + return value.apply(context); + } + if(value !== undefined) { + return value; + } + // silently ignore unkown variables + return ""; + }, + + // Utility methods + + /* includes tag */ + includes: function(needle, haystack) { + return haystack.indexOf(this.otag + needle) != -1; + }, + + /* + Does away with nasty characters + */ + escape: function(s) { + s = String(s === null ? "" : s); + return s.replace(/&(?!\w+;)|["'<>\\]/g, function(s) { + switch(s) { + case "&": return "&"; + case "\\": return "\\\\"; + case '"': return '"'; + case "'": return '''; + case "<": return "<"; + case ">": return ">"; + default: return s; + } + }); + }, + + // by @langalex, support for arrays of strings + create_context: function(_context) { + if(this.is_object(_context)) { + return _context; + } else { + var iterator = "."; + if(this.pragmas["IMPLICIT-ITERATOR"]) { + iterator = this.pragmas["IMPLICIT-ITERATOR"].iterator; + } + var ctx = {}; + ctx[iterator] = _context; + return ctx; + } + }, + + is_object: function(a) { + return a && typeof a == "object"; + }, + + is_array: function(a) { + return Object.prototype.toString.call(a) === '[object Array]'; + }, + + /* + Gets rid of leading and trailing whitespace + */ + trim: function(s) { + return s.replace(/^\s*|\s*$/g, ""); + }, + + /* + Why, why, why? Because IE. Cry, cry cry. + */ + map: function(array, fn) { + if (typeof array.map == "function") { + return array.map(fn); + } else { + var r = []; + var l = array.length; + for(var i = 0; i < l; i++) { + r.push(fn(array[i])); + } + return r; + } + } + }; + + return({ + name: "mustache.js", + version: "0.3.1-dev", + + /* + Turns a template and view into HTML + */ + to_html: function(template, view, partials, send_fun) { + var renderer = new Renderer(); + if(send_fun) { + renderer.send = send_fun; + } + renderer.render(template, view, partials); + if(!send_fun) { + return renderer.buffer.join("\n"); + } + } + }); +}(); + + $.mustache = function(template, view, partials) { + return Mustache.to_html(template, view, partials); + }; + +})(jQuery); diff --git a/log4j/src/main/webapp/WEB-INF/web.xml b/log4j/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..fda42b6 --- /dev/null +++ b/log4j/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,56 @@ + + + + + contextConfigLocation + classpath*:/server-bootstrap-*.xml + + + + org.springframework.web.context.ContextLoaderListener + + + + shallowEtagHeaderFilter + org.springframework.web.filter.ShallowEtagHeaderFilter + + + + hiddenHttpMethodFilter + org.springframework.web.filter.HiddenHttpMethodFilter + + + + shallowEtagHeaderFilter + /* + + + + hiddenHttpMethodFilter + /* + + + + main + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath*:/servlet-config.xml + + 1 + + + + main + / + + + + index.jsp + + + diff --git a/log4j/src/main/webapp/index.jsp b/log4j/src/main/webapp/index.jsp new file mode 100644 index 0000000..760e7bb --- /dev/null +++ b/log4j/src/main/webapp/index.jsp @@ -0,0 +1,327 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> + + + +Spring AMQP Log4J Demo + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ This application is a the "log4j" sample from Spring AMQP. + You can get the source code from the Spring + AMQP Samples project on Github. + +

+ Routing key for queue ' + + ' +

+
+
    +
  1. +
  2. +
  3. +
+ +

+
+ + + + + + + + + + + + + + + +
Logs from 'ServiceA'Logs from 'ServiceB'
+
+
    +
  1. +
  2. +
  3. +
  4. +
+
+
+
    +
  1. +
  2. +
  3. +
  4. +
+
+

Random log generation

+
+
    +
  1. +
  2. +
  3. +
+
+
+ +
+
+ +
+

+ Logs from queue ' + + ' +

+
Stopped
+
+ + + +

+ + + + + + + + + + + + +
TimeLoggerLevelMessageApplication
+
+ + + + + \ No newline at end of file diff --git a/log4j/src/test/java/org/springframework/amqp/rabbit/log4j/web/controller/AnnotationConfigContextLoader.java b/log4j/src/test/java/org/springframework/amqp/rabbit/log4j/web/controller/AnnotationConfigContextLoader.java new file mode 100644 index 0000000..8158c77 --- /dev/null +++ b/log4j/src/test/java/org/springframework/amqp/rabbit/log4j/web/controller/AnnotationConfigContextLoader.java @@ -0,0 +1,30 @@ +/* + * Copyright 2002-2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (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.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.springframework.amqp.rabbit.log4j.web.controller; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.test.context.ContextLoader; + +/** + * @author Jon Brisbin + */ +public class AnnotationConfigContextLoader implements ContextLoader { + public String[] processLocations(Class clazz, String... locations) { + return locations; + } + + public ApplicationContext loadContext(String... locations) throws Exception { + return new AnnotationConfigApplicationContext(locations); + } +} \ No newline at end of file diff --git a/log4j/src/test/java/org/springframework/amqp/rabbit/log4j/web/controller/IntegrationTest.java b/log4j/src/test/java/org/springframework/amqp/rabbit/log4j/web/controller/IntegrationTest.java new file mode 100644 index 0000000..1c486a5 --- /dev/null +++ b/log4j/src/test/java/org/springframework/amqp/rabbit/log4j/web/controller/IntegrationTest.java @@ -0,0 +1,103 @@ +/* + * Copyright 2002-2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (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.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.springframework.amqp.rabbit.log4j.web.controller; + +import static org.junit.Assert.assertTrue; + +import java.util.Date; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.amqp.rabbit.log4j.listener.AmqpLogMessageListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.util.CollectionUtils; + +/** + * This test is for checking does amqp appender in log4j properties and all bindings are declared correctly. + * @author tomas.lukosius@opencredo.com + * + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = { "org.springframework.amqp.rabbit.log4j.config.server" }, loader = AnnotationConfigContextLoader.class) +public class IntegrationTest { + protected Log logger = LogFactory.getLog(this.getClass()); + + @Autowired + private RabbitAdmin admin; + + @Autowired + private Queue allInfoQueue; + + @Autowired + private AmqpLogMessageListener messageListener; + + @Before + public void setUp() { + admin.purgeQueue(allInfoQueue.getName(), true); + } + + @After + public void clear() throws Exception { + + // Wait for broker communication to finish before trying to stop container + Thread.sleep(300L); + } + + @Test + public void logInfo() throws InterruptedException { + + CountDownLatch latch = new CountDownLatch(1); + new Thread(new MessageChecker(latch, messageListener)).start(); + + logger.info("My message: " + new Date()); + + boolean waited = latch.await(5000, TimeUnit.MILLISECONDS); + assertTrue("Time out waiting for message", waited); + } + + public static class MessageChecker implements Runnable { + + private final CountDownLatch latch; + private AmqpLogMessageListener messageListener; + + public MessageChecker(CountDownLatch latch, AmqpLogMessageListener messageListener) { + super(); + this.latch = latch; + this.messageListener = messageListener; + } + + public void run() { + while (latch.getCount() > 0) { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if (!CollectionUtils.isEmpty(messageListener.getLogs())) { + latch.countDown(); + } + } + + } + } +} diff --git a/pom.xml b/pom.xml index 600b799..c0dc969 100644 --- a/pom.xml +++ b/pom.xml @@ -9,6 +9,7 @@ helloworld stocks + log4j UTF-8