David Simpson avatar David Simpson committed 89ec17e

initial import

Comments (0)

Files changed (13)

+To avoid future confusion, we recommend that you include a license with your plugin.
+This file is simply a reminder.
+
+For a template license you can have a look at: http://www.opensource.org/licenses/
+
+Atlassian releases most of its modules under a BSD license: http://www.opensource.org/licenses/bsd-license.php
+You have successfully created a plugin using the Confluence plugin archetype!
+
+Here are the SDK commands you'll use immediately:
+
+* atlas-run   -- installs this plugin into Confluence and starts it on http://localhost:1990/confluence
+* atlas-debug -- same as atlas-run, but allows a debugger to attach at port 5005
+* atlas-cli   -- after atlas-run or atlas-debug, opens a Maven command line window:
+                 - 'pi' reinstalls the plugin into the running Confluence instance
+* atlas-help  -- prints description for all commands in the SDK
+
+Full documentation is always available at:
+
+https://developer.atlassian.com/display/DOCS/Developing+with+the+Atlassian+Plugin+SDK
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>com.example.plugins.tutorial</groupId>
+	<artifactId>plugin-license-compatibility-tutorial-for-confluence</artifactId>
+	<packaging>atlassian-plugin</packaging>
+	<name>plugin-license-compatibility-tutorial-for-confluence</name>
+	<version>1.0-SNAPSHOT</version>
+	<description>This is the com.example.plugins.tutorial:plugin-license-compatibility-tutorial-for-confluence plugin for Atlassian Confluence.</description>
+	<organization>
+		<name>Example Company</name>
+		<url>http://www.example.com/</url>
+	</organization>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>com.atlassian.maven.plugins</groupId>
+				<artifactId>maven-confluence-plugin</artifactId>
+				<version>3.7.2</version>
+				<extensions>true</extensions>
+				<configuration>
+					<productVersion>${confluence.version}</productVersion>
+					<productDataVersion>${confluence.data.version}</productDataVersion>
+					<!-- Licensing - start -->
+					<instructions>
+						<Import-Package>
+                            com.atlassian.plugin*;version="0.0",
+                            com.atlassian.sal*;version="0.0",
+                            com.google.common*;version="1.0",
+                            javax.servlet*;version="0.0",
+                            org.apache.commons*;version="0.0",
+                            org.osgi.framework*;version="0.0",
+                            org.osgi.util*;version="0.0",
+                            org.slf4j*;version="1.5",
+                            org.springframework.beans*;version="0.0",
+                            org.springframework.context*;version="0.0",
+                            org.springframework.osgi*;version="0.0"
+                        </Import-Package>
+						<Private-Package>
+                            com.atlassian.upm.license.storage.lib*
+                        </Private-Package>
+						<DynamicImport-Package>
+                            com.atlassian.upm.api.license;version="2.0",
+                            com.atlassian.upm.api.license.entity;version="2.0",
+                            com.atlassian.upm.api.util;version="2.0",
+                            com.atlassian.upm.license.storage.plugin;version="2.0"
+                        </DynamicImport-Package>
+					</instructions>
+					<bundledArtifacts>
+						<bundledArtifact>
+							<groupId>com.atlassian.upm</groupId>
+							<artifactId>atlassian-universal-plugin-manager-plugin</artifactId>
+							<version>1.6.3</version>
+						</bundledArtifact>
+					</bundledArtifacts>
+					<!-- Licensing - end -->
+				</configuration>
+			</plugin>
+			<plugin>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<configuration>
+					<source>1.6</source>
+					<target>1.6</target>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+	<dependencies>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.6</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>com.atlassian.confluence</groupId>
+			<artifactId>confluence</artifactId>
+			<version>${confluence.version}</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>com.atlassian.confluence.plugin</groupId>
+			<artifactId>func-test</artifactId>
+			<version>2.3</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>net.sourceforge.jwebunit</groupId>
+			<artifactId>jwebunit-htmlunit-plugin</artifactId>
+			<version>2.2</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>net.sourceforge.nekohtml</groupId>
+			<artifactId>nekohtml</artifactId>
+			<version>1.9.12</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>servlet-api</artifactId>
+			<version>2.4</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.mockito</groupId>
+			<artifactId>mockito-all</artifactId>
+			<version>1.8.5</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.httpcomponents</groupId>
+			<artifactId>httpclient</artifactId>
+			<version>4.1.1</version>
+			<scope>test</scope>
+		</dependency>
+		<!-- Licensing deps -->
+		<dependency>
+			<groupId>com.atlassian.upm</groupId>
+			<artifactId>plugin-license-storage-lib</artifactId>
+			<version>${upm.license.compatibility.version}</version>
+			<scope>compile</scope>
+			<!-- intentionally compile scoped -->
+		</dependency>
+		<dependency>
+			<groupId>com.atlassian.upm</groupId>
+			<artifactId>plugin-license-storage-plugin</artifactId>
+			<version>${upm.license.compatibility.version}</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>com.atlassian.upm</groupId>
+			<artifactId>licensing-api</artifactId>
+			<version>${upm.license.compatibility.version}</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>com.atlassian.upm</groupId>
+			<artifactId>upm-api</artifactId>
+			<version>${upm.license.compatibility.version}</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>com.atlassian.sal</groupId>
+			<artifactId>sal-api</artifactId>
+			<version>2.4.0</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.osgi</groupId>
+			<artifactId>spring-osgi-core</artifactId>
+			<version>1.1.3</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>commons-lang</groupId>
+			<artifactId>commons-lang</artifactId>
+			<version>2.4</version>
+			<scope>provided</scope>
+		</dependency>
+	</dependencies>
+	<properties>
+		<amps.version>3.7.2</amps.version>
+		<confluence.data.version>3.5</confluence.data.version>
+		<confluence.version>4.1</confluence.version>
+		<upm.license.compatibility.version>2.1-m3</upm.license.compatibility.version>
+	</properties>
+</project>

src/main/java/com/example/plugins/tutorial/ExampleMacro.java

+package com.example.plugins.tutorial;
+
+import java.util.Map;
+import java.util.List;
+import java.util.Iterator;
+
+import com.atlassian.renderer.RenderContext;
+import com.atlassian.renderer.v2.macro.BaseMacro;
+import com.atlassian.renderer.v2.macro.MacroException;
+import com.atlassian.renderer.v2.RenderMode;
+import com.atlassian.confluence.pages.PageManager;
+import com.atlassian.confluence.pages.Page;
+import com.atlassian.confluence.spaces.SpaceManager;
+import com.atlassian.confluence.user.AuthenticatedUserThreadLocal;
+import com.atlassian.user.User;
+import com.opensymphony.util.TextUtils;
+
+/**
+ * This very simple macro shows you the very basic use-case of displaying *something* on the Confluence page where it is used.
+ * Use this example macro to toy around, and then quickly move on to the next example - this macro doesn't
+ * really show you all the fun stuff you can do with Confluence.
+ */
+public class ExampleMacro extends BaseMacro
+{
+
+    // We just have to define the variables and the setters, then Spring injects the correct objects for us to use. Simple and efficient.
+    // You just need to know *what* you want to inject and use.
+
+    private final PageManager pageManager;
+    private final SpaceManager spaceManager;
+
+    public ExampleMacro(PageManager pageManager, SpaceManager spaceManager)
+    {
+        this.pageManager = pageManager;
+        this.spaceManager = spaceManager;
+    }
+
+    public boolean isInline()
+    {
+        return false;
+    }
+
+    public boolean hasBody()
+    {
+        return false;
+    }
+
+    public RenderMode getBodyRenderMode()
+    {
+        return RenderMode.NO_RENDER;
+    }
+
+    /**
+     * This method returns XHTML to be displayed on the page that uses this macro
+     * we just do random stuff here, trying to show how you can access the most basic
+     * managers and model objects. No emphasis is put on beauty of code nor on
+     * doing actually useful things :-)
+     */
+    public String execute(Map params, String body, RenderContext renderContext)
+            throws MacroException
+    {
+
+        // in this most simple example, we build the result in memory, appending HTML code to it at will.
+        // this is something you absolutely don't want to do once you start writing plugins for real. Refer
+        // to the next example for better ways to render content.
+        StringBuffer result = new StringBuffer();
+
+        // get the currently logged in user and display his name
+        User user = AuthenticatedUserThreadLocal.getUser();
+        if (user != null)
+        {
+            String greeting = "Hello " + TextUtils.htmlEncode(user.getFullName()) + "<br><br>";
+            result.append(greeting);
+        }
+
+        //get the pages added in the last 55 days to the DS space ("Demo Space"), and display them
+        List list = pageManager.getRecentlyAddedPages(55, "DS");
+        result.append("Some stats for the Demo space: <br> ");
+        for (Iterator i = list.iterator(); i.hasNext();)
+        {
+            Page page = (Page) i.next();
+            int numberOfChildren = page.getChildren().size();
+            String pageWithChildren = "Page " + TextUtils.htmlEncode(page.getTitle()) + " has " + numberOfChildren + " children <br> ";
+            result.append(pageWithChildren);
+        }
+
+        // and show the number of all spaces in this installation.
+        String spaces = "<br>Altogether, this installation has " + spaceManager.getAllSpaces().size() + " spaces. <br>";
+        result.append(spaces);
+
+        // this concludes our little demo. Now you should understand the basics of code injection use in Confluence, and how
+        // to get a really simple macro running.
+
+        return result.toString();
+    }
+
+}

src/main/java/com/example/plugins/tutorial/servlet/LicenseServlet.java

+package com.example.plugins.tutorial.servlet;
+
+import java.io.IOException;
+import javax.servlet.ServletException; 
+import javax.servlet.http.HttpServlet; 
+import javax.servlet.http.HttpServletRequest; 
+import javax.servlet.http.HttpServletResponse;
+import com.atlassian.sal.api.ApplicationProperties; 
+import com.atlassian.upm.api.license.entity.PluginLicense; 
+import com.atlassian.upm.api.util.Option; 
+import com.atlassian.upm.license.storage.lib.ThirdPartyPluginLicenseStorageManager;
+import org.apache.commons.lang.StringUtils;
+
+public class LicenseServlet extends HttpServlet {
+	
+	private final ThirdPartyPluginLicenseStorageManager thirdPartyPluginLicenseStorageManager; 
+	private final ApplicationProperties applicationProperties;
+	
+	public LicenseServlet(ThirdPartyPluginLicenseStorageManager thirdPartyPluginLicenseStorageManager, ApplicationProperties applicationProperties)
+	{
+		this.thirdPartyPluginLicenseStorageManager = thirdPartyPluginLicenseStorageManager; 
+		this.applicationProperties = applicationProperties;
+	}
+	
+	@Override
+	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+	{
+		resp.setContentType("text/html");
+		resp.getWriter().write("<html><body>"); 
+		outputBody(resp); 
+		resp.getWriter().write("</body></html>"); 
+		resp.getWriter().close();
+	}
+	
+	private void outputBody(HttpServletResponse resp) throws ServletException, IOException 
+	{
+		resp.getWriter().write("<br><br>UPM is licensing-aware: " + thirdPartyPluginLicenseStorageManager.isUpmLicensingAware());
+		resp.getWriter().write("<br>Plugin key: " + thirdPartyPluginLicenseStorageManager.getPluginKey());
+		
+		if (!thirdPartyPluginLicenseStorageManager.isUpmLicensingAware()) {
+			resp.getWriter().write("<br><br>Update your license");
+			resp.getWriter().write("<br><form action=\"" + applicationProperties.getBaseUrl() + "/plugins/servlet/licenseservlet\" method=\"POST\">");
+			resp.getWriter().write("<textarea name=\"license\" cols=\"80\" rows=\"10\">"); 
+			for (String storedRawLicense : thirdPartyPluginLicenseStorageManager.getRawLicense()) {
+				//enter the stored license into the textarea, if the license has been stored 
+				resp.getWriter().write(storedRawLicense);
+			} 
+			resp.getWriter().write("</textarea>"); resp.getWriter().write("<br><input type=\"submit\" value=\"Save\" />"); resp.getWriter().write("</form>");
+		} else {
+			resp.getWriter().write("<br>Cannot modify plugin licenses with this API when UPM is licensing-aware. Please use ");
+			resp.getWriter().write("<a href=\"" + thirdPartyPluginLicenseStorageManager.getPluginManagementUri() + "\">UPM's licensing UI</a>.");
+		}
+	}
+	
+	@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
+	IOException {
+		
+		resp.setContentType("text/html"); 
+		resp.getWriter().write("<html><body><b>");
+		
+		if (!thirdPartyPluginLicenseStorageManager.isUpmLicensingAware()) 
+		{
+			String license = req.getParameter("license"); 
+			if (!StringUtils.isEmpty(license)) 
+			{
+				//we have a non-empty license parameter - let's update the license if it is valid.
+				Option<PluginLicense> validatedLicense = thirdPartyPluginLicenseStorageManager.validateLicense(license);
+				
+				if (validatedLicense.isDefined()) 
+				{
+					thirdPartyPluginLicenseStorageManager.setRawLicense(license); 
+					resp.getWriter().write("Valid license. License has been updated.");
+				} 
+				else 
+				{
+					resp.getWriter().write("Invalid license. License has not been updated.");
+				}
+			} 
+			else 
+			{
+				//we have an empty/null license parameter - let's remove the stored license 
+				thirdPartyPluginLicenseStorageManager.removeRawLicense(); 
+				resp.getWriter().write("License has been removed.");
+			}
+		} 
+		else 
+		{
+			//don't allow POSTs to occur to our license servlet if UPM is licensing-aware
+			resp.getWriter().write("Nice try! You cannot update your plugin license with this API when UPM is licensing-aware.");
+		}
+		
+		resp.getWriter().write("</b>"); 
+		outputBody(resp); 
+		resp.getWriter().write("</body></html>"); 
+		resp.getWriter().close();	
+	}
+}

src/main/resources/atlassian-plugin.properties

+#
+#Thu Jan 26 11:00:58 GMT 2012
+license-servlet.name=License Servlet
+license-servlet.description=The License Servlet Plugin

src/main/resources/atlassian-plugin.xml

+<?xml version="1.0" encoding="UTF-8"?>
+
+<atlassian-plugin key="${project.groupId}.${project.artifactId}" name="${project.name}" plugins-version="2">
+  <plugin-info>
+    <description>${project.description}</description>
+    <version>${project.version}</version>
+    <vendor name="${project.organization.name}" url="${project.organization.url}"/>
+    <param name="atlassian-licensing-enabled">true</param>
+  </plugin-info>
+  <macro name="plugin-license-compatibility-tutorial-for-confluence" class="com.example.plugins.tutorial.ExampleMacro" key="my-macro">
+    <!-- TODO: Add macro description -->
+    <!-- <description></description> -->
+  </macro>
+  <servlet name="License Servlet" i18n-name-key="license-servlet.name" key="license-servlet" class="com.example.plugins.tutorial.servlet.LicenseServlet">
+    <description key="license-servlet.description">The License Servlet Plugin</description>
+    <url-pattern>/licenseservlet</url-pattern>
+  </servlet>
+  <resource type="i18n" name="i18n" location="atlassian-plugin"/>
+
+  <component-import key="pluginAccessor" interface="com.atlassian.plugin.PluginAccessor"/> 
+  <component-import key="pluginController" interface="com.atlassian.plugin.PluginController"/> 
+  <component-import key="txTemplate" interface="com.atlassian.sal.api.transaction.TransactionTemplate"/>
+  <component-import key="applicationProperties" interface="com.atlassian.sal.api.ApplicationProperties"/>
+  <component key="pluginLicenseStoragePluginInstaller" class="com.atlassian.upm.license.storage.lib.PluginLicenseStoragePluginInstaller"/> <component key="thirdPartyPluginLicenseStorageManager" class="com.atlassian.upm.license.storage.lib.ThirdPartyPluginLicenseStorageManagerImpl"/>
+</atlassian-plugin>

src/test/java/com/example/plugins/tutorial/ExampleMacroTest.java

+package com.example.plugins.tutorial;
+
+import org.junit.Test;
+
+/**
+ * Testing {@link com.example.plugins.tutorial.ExampleMacro}
+ */
+public class ExampleMacroTest
+{
+    @Test
+    public void basic()
+    {
+        // add test here...
+    }
+}

src/test/java/com/example/plugins/tutorial/servlet/LicenseServletTest.java

+package com.example.plugins.tutorial.servlet;
+
+import org.junit.Test;
+import org.junit.After;
+import org.junit.Before;
+import org.mockito.Mockito;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+
+public class LicenseServletTest {
+
+    HttpServletRequest mockRequest;
+    HttpServletResponse mockResponse;
+
+    @Before
+    public void setup() {
+        mockRequest = mock(HttpServletRequest.class);
+        mockResponse = mock(HttpServletResponse.class);
+    }
+
+    @After
+    public void tearDown() {
+
+    }
+
+    @Test
+    public void testSomething() {
+        String expected = "test";
+        when(mockRequest.getParameter(Mockito.anyString())).thenReturn(expected);
+        assertEquals(expected,mockRequest.getParameter("some string"));
+
+    }
+}

src/test/java/it/AbstractIntegrationTestCase.java

+package it;
+
+import com.atlassian.confluence.plugin.functest.AbstractConfluencePluginWebTestCase;
+import com.atlassian.confluence.plugin.functest.JWebUnitConfluenceWebTester;
+import com.atlassian.confluence.plugin.functest.TesterConfiguration;
+import junit.framework.Assert;
+
+import java.io.IOException;
+import java.util.Properties;
+
+public class AbstractIntegrationTestCase extends AbstractConfluencePluginWebTestCase
+{
+    @Override
+    protected JWebUnitConfluenceWebTester createConfluenceWebTester()
+    {
+        Properties props = new Properties();
+        props.put("confluence.webapp.protocol", "http");
+        props.put("confluence.webapp.host", "localhost");
+
+        // this is deceiving: the func test library checks for the system properties
+        // *before* checking in this properties file for these values, so these
+        // properties are technically ignored
+        props.put("confluence.webapp.port", Integer.parseInt(System.getProperty("http.port")));
+        props.put("confluence.webapp.context.path", System.getProperty("context.path"));
+
+        props.put("confluence.auth.admin.username", "admin");
+        props.put("confluence.auth.admin.password", "admin");
+
+        TesterConfiguration conf;
+        try
+        {
+            conf = new TesterConfiguration(props);
+        }
+        catch (IOException ioe)
+        {
+            Assert.fail("Unable to create tester: " + ioe.getMessage());
+            return null;
+        }
+
+        JWebUnitConfluenceWebTester tester = new JWebUnitConfluenceWebTester(conf);
+
+        tester.getTestContext().setBaseUrl(tester.getBaseUrl());
+        tester.setScriptingEnabled(false);
+
+        return tester;
+    }
+}

src/test/java/it/IntegrationTestMyPlugin.java

+package it;
+
+public class IntegrationTestMyPlugin extends AbstractIntegrationTestCase
+{
+	public void testSomething()
+	{
+        gotoPage("");
+        assertTextPresent("Welcome");
+	}
+}

src/test/java/it/com/example/plugins/tutorial/servlet/LicenseServletFuncTest.java

+package it.com.example.plugins.tutorial.servlet;
+
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.BasicResponseHandler;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.junit.Test;
+import org.junit.After;
+import org.junit.Before;
+
+import java.io.IOException;
+
+import static org.junit.Assert.*;
+
+
+public class LicenseServletFuncTest {
+
+    HttpClient httpClient;
+    String baseUrl;
+    String servletUrl;
+
+    @Before
+    public void setup() {
+        httpClient = new DefaultHttpClient();
+        baseUrl = System.getProperty("baseurl");
+        servletUrl = baseUrl + "/plugins/servlet/licenseservlet";
+    }
+
+    @After
+    public void tearDown() {
+        httpClient.getConnectionManager().shutdown();
+    }
+
+    @Test
+    public void testSomething() throws IOException {
+        HttpGet httpget = new HttpGet(servletUrl);
+
+        // Create a response handler
+        ResponseHandler<String> responseHandler = new BasicResponseHandler();
+        String responseBody = httpClient.execute(httpget, responseHandler);
+        assertTrue(null != responseBody && !"".equals(responseBody));
+    }
+}
+Thu Jan 26 11:00:23 GMT 2012  [debug] AvalonLogSystem initialized using logfile 'velocity.log'
+Thu Jan 26 11:00:23 GMT 2012   [info] ************************************************************** 
+Thu Jan 26 11:00:23 GMT 2012   [info] Starting Jakarta Velocity v1.4
+Thu Jan 26 11:00:23 GMT 2012   [info] RuntimeInstance initializing.
+Thu Jan 26 11:00:23 GMT 2012   [info] Default Properties File: org/apache/velocity/runtime/defaults/velocity.properties
+Thu Jan 26 11:00:23 GMT 2012   [info] Trying to use logger class org.apache.velocity.runtime.log.AvalonLogSystem
+Thu Jan 26 11:00:23 GMT 2012   [info] Using logger class org.apache.velocity.runtime.log.AvalonLogSystem
+Thu Jan 26 11:00:23 GMT 2012   [info] Default ResourceManager initializing. (class org.apache.velocity.runtime.resource.ResourceManagerImpl)
+Thu Jan 26 11:00:23 GMT 2012   [info] Resource Loader Instantiated: org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
+Thu Jan 26 11:00:23 GMT 2012   [info] ClasspathResourceLoader : initialization starting.
+Thu Jan 26 11:00:23 GMT 2012   [info] ClasspathResourceLoader : initialization complete.
+Thu Jan 26 11:00:23 GMT 2012   [info] ResourceCache : initialized. (class org.apache.velocity.runtime.resource.ResourceCacheImpl)
+Thu Jan 26 11:00:23 GMT 2012   [info] Default ResourceManager initialization complete.
+Thu Jan 26 11:00:23 GMT 2012   [info] Loaded System Directive: org.apache.velocity.runtime.directive.Literal
+Thu Jan 26 11:00:23 GMT 2012   [info] Loaded System Directive: org.apache.velocity.runtime.directive.Macro
+Thu Jan 26 11:00:23 GMT 2012   [info] Loaded System Directive: org.apache.velocity.runtime.directive.Parse
+Thu Jan 26 11:00:23 GMT 2012   [info] Loaded System Directive: org.apache.velocity.runtime.directive.Include
+Thu Jan 26 11:00:23 GMT 2012   [info] Loaded System Directive: org.apache.velocity.runtime.directive.Foreach
+Thu Jan 26 11:00:23 GMT 2012   [info] Created: 3 parsers.
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : initialization starting.
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : adding VMs from VM library template : templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #conditions( condition ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #params( map ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #contextprovider( classname ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #resource( resource ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #resources( resourceList ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #icon( icon ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #link( link ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #label( label ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #tooltip( tooltip ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #dependencies( dependencies ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #dependency( dependency ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #contexts( contexts ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #resourcecontext( resourceContext ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #transformations( transformations ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #transformation( transformation ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #dispatchers( dispatchers ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #dispatcher( dispatcher ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #packages( packages ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #package( package ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #actions( actions ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #action( action ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #views( views ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : added new VM : #view( view ) : source = templates/macros.vm
+Thu Jan 26 11:00:23 GMT 2012  [error] VM #params: error : too few arguments to macro. Wanted 1 got 0
+Thu Jan 26 11:00:23 GMT 2012  [error] VM #conditions: error : too few arguments to macro. Wanted 1 got 0
+Thu Jan 26 11:00:23 GMT 2012  [error] VM #link: error : too few arguments to macro. Wanted 1 got 0
+Thu Jan 26 11:00:23 GMT 2012  [error] VM #dependency: error : too few arguments to macro. Wanted 1 got 0
+Thu Jan 26 11:00:23 GMT 2012  [error] VM #resourcecontext: error : too few arguments to macro. Wanted 1 got 0
+Thu Jan 26 11:00:23 GMT 2012  [error] VM #transformation: error : too few arguments to macro. Wanted 1 got 0
+Thu Jan 26 11:00:23 GMT 2012  [error] VM #dispatcher: error : too few arguments to macro. Wanted 1 got 0
+Thu Jan 26 11:00:23 GMT 2012  [error] VM #package: error : too few arguments to macro. Wanted 1 got 0
+Thu Jan 26 11:00:23 GMT 2012  [error] VM #action: error : too few arguments to macro. Wanted 1 got 0
+Thu Jan 26 11:00:23 GMT 2012  [error] VM #views: error : too few arguments to macro. Wanted 1 got 0
+Thu Jan 26 11:00:23 GMT 2012  [error] VM #view: error : too few arguments to macro. Wanted 1 got 0
+Thu Jan 26 11:00:23 GMT 2012   [info] ResourceManager : found templates/macros.vm with loader org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro :  VM library template macro registration complete.
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : allowInline = true : VMs can be defined inline in templates
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : allowInlineToOverride = false : VMs defined inline may NOT replace previous VM definitions
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : allowInlineLocal = false : VMs defined inline will be  global in scope if allowed.
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : messages on  : VM system will output logging messages
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : autoload off  : VM system will not automatically reload global library macros
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocimacro : initialization complete.
+Thu Jan 26 11:00:23 GMT 2012   [info] Velocity successfully started.
+Thu Jan 26 11:00:58 GMT 2012   [info] ResourceManager : found templates/common/servlet/Servlet.java.vtl with loader org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
+Thu Jan 26 11:00:58 GMT 2012   [info] ResourceManager : found templates/common/servlet/ServletTest.java.vtl with loader org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
+Thu Jan 26 11:00:58 GMT 2012   [info] ResourceManager : found templates/common/servlet/ServletFuncTest.java.vtl with loader org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
+Thu Jan 26 11:00:58 GMT 2012   [info] ResourceManager : found templates/common/servlet/servlet-plugin.xml.vtl with loader org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.