Author: rombert Date: Thu Sep 5 13:39:33 2013 New Revision: 1520302 URL: http://svn.apache.org/r1520302 Log: SLING-2989 - [Tooling] integrate with vlt once available
Have a (seemingly) functional checkout with .content.xml from a Sling repo TODO: - very very slow - no filtering , we use the default workspace filters - still no write support Added: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/OSGI-INF/VaultFsLocatorImpl.xml (with props) sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/OSGI-INF/VltSerializationManagerImpl.xml (with props) sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/RepositoryUtils.java (with props) sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/VaultFsLocator.java - copied, changed from r1514762, sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/VaultFsLocatorImpl.java - copied, changed from r1514762, sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/serialization/ sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java (with props) Modified: sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/transport/Repository.java sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/transport/ResourceProxy.java sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportWizard.java sling/branches/tooling-ide-vlt/tooling/ide/impl-resource-test/src/test/java/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManagerTest.java sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManager.java sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/AbstractRepository.java sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/GetNodeContentCommand.java sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/RepositoryImpl.java sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/META-INF/MANIFEST.MF sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/OSGI-INF/VltRepository.xml sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/GetNodeContentCommand.java sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/JcrCommand.java sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/ListChildrenCommand.java sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/VltRepository.java sling/branches/tooling-ide-vlt/tooling/ide/target-definition/org.apache.sling.ide.target-definition.target sling/branches/tooling-ide-vlt/tooling/ide/vlt-wrapper/META-INF/MANIFEST.MF Modified: sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java?rev=1520302&r1=1520301&r2=1520302&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java Thu Sep 5 13:39:33 2013 @@ -20,6 +20,9 @@ import java.io.IOException; import java.io.InputStream; import java.util.Map; +import org.apache.sling.ide.transport.RepositoryInfo; +import org.apache.sling.ide.transport.ResourceProxy; + public interface SerializationManager { boolean isSerializationFile(String filePath); @@ -28,7 +31,7 @@ public interface SerializationManager { String getSerializationFilePath(String baseFilePath); - String buildSerializationData(Map<String, Object> content) throws IOException; + String buildSerializationData(ResourceProxy resource, RepositoryInfo repositoryInfo) throws IOException; Map<String, Object> readSerializationData(InputStream source) throws IOException; } Modified: sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/transport/Repository.java URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/transport/Repository.java?rev=1520302&r1=1520301&r2=1520302&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/transport/Repository.java (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/transport/Repository.java Thu Sep 5 13:39:33 2013 @@ -81,6 +81,8 @@ public interface Repository { // FIXME this is not thread-safe and with multiple sling servers will fail intermitently public void setRepositoryInfo(RepositoryInfo repositoryInfo); + RepositoryInfo getRepositoryInfo(); + Command<Void> newAddNodeCommand(FileInfo fileInfo); Command<Void> newUpdateContentNodeCommand(FileInfo fileInfo, Map<String, Object> serializationData); @@ -101,7 +103,7 @@ public interface Repository { * @param path * @return all properties for the resource located at <tt>path</tt> */ - Command<Map<String, Object>> newGetNodeContentCommand(String path); + Command<ResourceProxy> newGetNodeContentCommand(String path); Command<byte[]> newGetNodeCommand(String path); } Modified: sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/transport/ResourceProxy.java URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/transport/ResourceProxy.java?rev=1520302&r1=1520301&r2=1520302&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/transport/ResourceProxy.java (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/transport/ResourceProxy.java Thu Sep 5 13:39:33 2013 @@ -26,6 +26,7 @@ public class ResourceProxy { private final String path; private final Map<String, Object> properties = new HashMap<String, Object>(); private final List<ResourceProxy> children = new ArrayList<ResourceProxy>(); + private final Map<Class<?>, Object> adapted = new HashMap<Class<?>, Object>(1); public ResourceProxy(String path) { this.path = path; @@ -53,6 +54,19 @@ public class ResourceProxy { return properties; } + public <T> void addAdapted(Class<T> klazz, T adaptedInstance) { + + adapted.put(klazz, adaptedInstance); + } + + public <T> T adaptTo(Class<T> klazz) { + + // OK to suppress warnings since type safety is insured by addAdapted + @SuppressWarnings("unchecked") + T res = (T) adapted.get(klazz); + + return res; + } @Override public String toString() { Modified: sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportWizard.java URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportWizard.java?rev=1520302&r1=1520301&r2=1520302&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportWizard.java (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportWizard.java Thu Sep 5 13:39:33 2013 @@ -20,7 +20,6 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; -import java.util.Map; import org.apache.sling.ide.eclipse.core.ISlingLaunchpadServer; import org.apache.sling.ide.eclipse.core.ServerUtil; @@ -233,9 +232,10 @@ public class ImportWizard extends Wizard //DO NOTHING } else { createFolder(project, projectRelativePath.append(path)); - Map<String, Object> content = executeCommand(repository.newGetNodeContentCommand(path)); + ResourceProxy resourceToSerialize = executeCommand(repository.newGetNodeContentCommand(path)); - String out = serializationManager.buildSerializationData(content); + String out = serializationManager.buildSerializationData(resourceToSerialize, + repository.getRepositoryInfo()); if (out != null) { createFile(project, projectRelativePath.append(serializationManager.getSerializationFilePath(path)), out.getBytes("UTF-8")); @@ -289,6 +289,9 @@ public class ImportWizard extends Wizard private void createFile(IProject project, IPath path, byte[] node) throws CoreException { IFile destinationFile = project.getFile(path); + + System.out.println("Writing content file at " + path); + if ( destinationFile.exists() ) { /* TODO progress monitor */ destinationFile.setContents(new ByteArrayInputStream(node), IResource.KEEP_HISTORY, null); Modified: sling/branches/tooling-ide-vlt/tooling/ide/impl-resource-test/src/test/java/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManagerTest.java URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/impl-resource-test/src/test/java/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManagerTest.java?rev=1520302&r1=1520301&r2=1520302&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/impl-resource-test/src/test/java/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManagerTest.java (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/impl-resource-test/src/test/java/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManagerTest.java Thu Sep 5 13:39:33 2013 @@ -12,6 +12,7 @@ import java.io.StringReader; import java.util.HashMap; import java.util.Map; +import org.apache.sling.ide.transport.ResourceProxy; import org.custommonkey.xmlunit.XMLUnit; import org.junit.Before; import org.junit.BeforeClass; @@ -36,15 +37,23 @@ public class SimpleXmlSerializationManag @Test public void emptySerializedData() throws IOException, SAXException { - String serializationData = sm.buildSerializationData(new HashMap<String, Object>()); + String serializationData = sm.buildSerializationData(newResourceWithProperties(new HashMap<String, Object>()), null); assertThat(serializationData, is(nullValue())); } + private ResourceProxy newResourceWithProperties(Map<String, Object> properties) { + ResourceProxy resource = new ResourceProxy("/"); + for (Map.Entry<String, Object> entry : properties.entrySet()) { + resource.addProperty(entry.getKey(), entry.getValue()); + } + return resource; + } + @Test public void nullSerializedData() throws IOException, SAXException { - String serializationData = sm.buildSerializationData(null); + String serializationData = sm.buildSerializationData(null, null); assertThat(serializationData, is(nullValue())); } @@ -56,7 +65,7 @@ public class SimpleXmlSerializationManag data.put("jcr:createdBy", "admin"); data.put("jcr:lastModifiedBy", "author"); - String serializationData = sm.buildSerializationData(data); + String serializationData = sm.buildSerializationData(newResourceWithProperties(data), null); String methodName = "stringSerializedData"; @@ -84,7 +93,7 @@ public class SimpleXmlSerializationManag Map<String, Object> data = new HashMap<String, Object>(); data.put("jcr:description", "<p class=\"active\">Welcome</p>"); - String serializationData = sm.buildSerializationData(data); + String serializationData = sm.buildSerializationData(newResourceWithProperties(data), null); String methodName = "serializedDataIsEscaped"; Modified: sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManager.java URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManager.java?rev=1520302&r1=1520301&r2=1520302&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManager.java (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManager.java Thu Sep 5 13:39:33 2013 @@ -35,6 +35,8 @@ import javax.xml.transform.sax.Transform import javax.xml.transform.stream.StreamResult; import org.apache.sling.ide.serialization.SerializationManager; +import org.apache.sling.ide.transport.RepositoryInfo; +import org.apache.sling.ide.transport.ResourceProxy; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -96,7 +98,13 @@ public class SimpleXmlSerializationManag } @Override - public String buildSerializationData(Map<String, Object> content) throws IOException { + public String buildSerializationData(ResourceProxy resource, RepositoryInfo repositoryInfo) throws IOException { + + if (resource == null) { + return null; + } + + Map<String, Object> content = resource.getProperties(); if (content == null || content.isEmpty()) { return null; Modified: sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/AbstractRepository.java URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/AbstractRepository.java?rev=1520302&r1=1520301&r2=1520302&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/AbstractRepository.java (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/AbstractRepository.java Thu Sep 5 13:39:33 2013 @@ -27,6 +27,10 @@ public abstract class AbstractRepository this.repositoryInfo=repositoryInfo; } + @Override + public RepositoryInfo getRepositoryInfo() { + return repositoryInfo; + } @Override public String toString() { Modified: sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/GetNodeContentCommand.java URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/GetNodeContentCommand.java?rev=1520302&r1=1520301&r2=1520302&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/GetNodeContentCommand.java (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/GetNodeContentCommand.java Thu Sep 5 13:39:33 2013 @@ -16,8 +16,6 @@ */ package org.apache.sling.ide.impl.resource.transport; -import java.util.HashMap; -import java.util.Map; import org.apache.commons.httpclient.Credentials; import org.apache.commons.httpclient.HttpClient; @@ -26,18 +24,19 @@ import org.apache.commons.httpclient.aut import org.apache.commons.httpclient.methods.GetMethod; import org.apache.sling.ide.transport.RepositoryException; import org.apache.sling.ide.transport.RepositoryInfo; +import org.apache.sling.ide.transport.ResourceProxy; import org.apache.sling.ide.transport.Result; import org.json.JSONArray; import org.json.JSONObject; -class GetNodeContentCommand extends AbstractCommand<Map<String, Object>> { +class GetNodeContentCommand extends AbstractCommand<ResourceProxy> { GetNodeContentCommand(RepositoryInfo repositoryInfo, HttpClient httpClient, String relativePath) { super(repositoryInfo, httpClient, relativePath); } @Override - public Result<Map<String, Object>> execute() { + public Result<ResourceProxy> execute() { GetMethod get = new GetMethod(getPath()); try{ httpClient.getParams().setAuthenticationPreemptive(true); @@ -51,20 +50,20 @@ class GetNodeContentCommand extends Abst JSONObject result = new JSONObject(get.getResponseBodyAsString()); - Map<String, Object> properties = new HashMap<String, Object>(); + ResourceProxy resource = new ResourceProxy(path); JSONArray names = result.names(); for (int i = 0; i < names.length(); i++) { String name = names.getString(i); Object object = result.get(name); if (object instanceof String) { - properties.put(name, object); + resource.addProperty(name, object); } else { System.out.println("Property '" + name + "' of type '" + object.getClass().getName() + " is not handled"); } } - return AbstractResult.success(properties); + return AbstractResult.success(resource); } catch (Exception e) { return AbstractResult.failure(new RepositoryException(e)); }finally{ Modified: sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/RepositoryImpl.java URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/RepositoryImpl.java?rev=1520302&r1=1520301&r2=1520302&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/RepositoryImpl.java (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/RepositoryImpl.java Thu Sep 5 13:39:33 2013 @@ -57,7 +57,7 @@ public class RepositoryImpl extends Abst } @Override - public Command<Map<String, Object>> newGetNodeContentCommand(final String path) { + public Command<ResourceProxy> newGetNodeContentCommand(final String path) { return wrap(new GetNodeContentCommand(repositoryInfo, httpClient, path + ".json")); } Modified: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/META-INF/MANIFEST.MF URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/META-INF/MANIFEST.MF?rev=1520302&r1=1520301&r2=1520302&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/META-INF/MANIFEST.MF (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/META-INF/MANIFEST.MF Thu Sep 5 13:39:33 2013 @@ -7,8 +7,13 @@ Bundle-RequiredExecutionEnvironment: Jav Require-Bundle: org.eclipse.equinox.ds;bundle-version="1.2.1", org.eclipse.osgi.services;bundle-version="3.2.100" Import-Package: javax.jcr, + org.apache.jackrabbit.vault.fs, org.apache.jackrabbit.vault.fs.api, + org.apache.jackrabbit.vault.fs.config, + org.apache.jackrabbit.vault.fs.impl, + org.apache.jackrabbit.vault.fs.impl.io, org.apache.jackrabbit.vault.util, + org.apache.sling.ide.serialization, org.apache.sling.ide.transport, org.osgi.service.event;version="1.3.0" Service-Component: OSGI-INF/*.xml Added: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/OSGI-INF/VaultFsLocatorImpl.xml URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/OSGI-INF/VaultFsLocatorImpl.xml?rev=1520302&view=auto ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/OSGI-INF/VaultFsLocatorImpl.xml (added) +++ sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/OSGI-INF/VaultFsLocatorImpl.xml Thu Sep 5 13:39:33 2013 @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="false"> + <implementation class="org.apache.sling.ide.impl.vlt.VaultFsLocatorImpl"/> + <service> + <provide interface="org.apache.sling.ide.impl.vlt.VaultFsLocator"/> + </service> +</scr:component> Propchange: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/OSGI-INF/VaultFsLocatorImpl.xml ------------------------------------------------------------------------------ svn:eol-style = native Propchange: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/OSGI-INF/VaultFsLocatorImpl.xml ------------------------------------------------------------------------------ svn:mime-type = text/xml Modified: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/OSGI-INF/VltRepository.xml URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/OSGI-INF/VltRepository.xml?rev=1520302&r1=1520301&r2=1520302&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/OSGI-INF/VltRepository.xml (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/OSGI-INF/VltRepository.xml Thu Sep 5 13:39:33 2013 @@ -5,4 +5,5 @@ <provide interface="org.apache.sling.ide.transport.Repository"/> </service> <reference bind="bindEventAdmin" cardinality="1..1" interface="org.osgi.service.event.EventAdmin" name="EventAdmin" policy="static" unbind="unbindEventAdmin"/> + <property name="service.ranking" type="Integer" value="100"/> </scr:component> Added: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/OSGI-INF/VltSerializationManagerImpl.xml URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/OSGI-INF/VltSerializationManagerImpl.xml?rev=1520302&view=auto ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/OSGI-INF/VltSerializationManagerImpl.xml (added) +++ sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/OSGI-INF/VltSerializationManagerImpl.xml Thu Sep 5 13:39:33 2013 @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="false"> + <implementation class="org.apache.sling.ide.impl.vlt.serialization.VltSerializationManager"/> + <service> + <provide interface="org.apache.sling.ide.serialization.SerializationManager"/> + </service> + <reference bind="bindVaultFsLocator" cardinality="1..1" interface="org.apache.sling.ide.impl.vlt.VaultFsLocator" name="VaultFsLocator" policy="static" unbind="unbindVaultFsLocator"/> + <property name="service.ranking" type="Integer" value="100"/> +</scr:component> Propchange: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/OSGI-INF/VltSerializationManagerImpl.xml ------------------------------------------------------------------------------ svn:eol-style = native Propchange: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/OSGI-INF/VltSerializationManagerImpl.xml ------------------------------------------------------------------------------ svn:mime-type = text/xml Modified: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/GetNodeContentCommand.java URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/GetNodeContentCommand.java?rev=1520302&r1=1520301&r2=1520302&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/GetNodeContentCommand.java (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/GetNodeContentCommand.java Thu Sep 5 13:39:33 2013 @@ -16,42 +16,25 @@ */ package org.apache.sling.ide.impl.vlt; -import java.util.HashMap; -import java.util.Map; - import javax.jcr.Credentials; import javax.jcr.Node; -import javax.jcr.Property; -import javax.jcr.PropertyIterator; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; -public class GetNodeContentCommand extends JcrCommand<Map<String, Object>> { +import org.apache.sling.ide.transport.ResourceProxy; + +public class GetNodeContentCommand extends JcrCommand<ResourceProxy> { public GetNodeContentCommand(Repository repository, Credentials credentials, String path) { super(repository, credentials, path); } @Override - protected Map<String, Object> execute0(Session session) throws RepositoryException { + protected ResourceProxy execute0(Session session) throws RepositoryException { Node node = session.getNode(getPath()); - PropertyIterator properties = node.getProperties(); - - Map<String, Object> props = new HashMap<String, Object>(); - while (properties.hasNext()) { - - Property property = properties.nextProperty(); - Object value = ConversionUtils.getPropertyValue(property); - if (value == null) { - continue; - } - props.put(property.getName(), value); - } - - return props; + return nodeToResource(node); } - } Modified: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/JcrCommand.java URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/JcrCommand.java?rev=1520302&r1=1520301&r2=1520302&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/JcrCommand.java (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/JcrCommand.java Thu Sep 5 13:39:33 2013 @@ -20,11 +20,15 @@ import java.io.IOException; import javax.jcr.Credentials; import javax.jcr.LoginException; +import javax.jcr.Node; +import javax.jcr.Property; +import javax.jcr.PropertyIterator; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; import org.apache.sling.ide.transport.Command; +import org.apache.sling.ide.transport.ResourceProxy; import org.apache.sling.ide.transport.Result; public abstract class JcrCommand<T> implements Command<T> { @@ -61,4 +65,25 @@ public abstract class JcrCommand<T> impl public String getPath() { return path; } + + + protected ResourceProxy nodeToResource(Node node) throws RepositoryException { + + ResourceProxy resource = new ResourceProxy(node.getPath()); + resource.addAdapted(Node.class, node); + + PropertyIterator properties = node.getProperties(); + while (properties.hasNext()) { + Property property = properties.nextProperty(); + String propertyName = property.getName(); + Object propertyValue = ConversionUtils.getPropertyValue(property); + + if (propertyValue != null) { + resource.addProperty(propertyName, propertyValue); + } + } + + return resource; + + } } Modified: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/ListChildrenCommand.java URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/ListChildrenCommand.java?rev=1520302&r1=1520301&r2=1520302&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/ListChildrenCommand.java (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/ListChildrenCommand.java Thu Sep 5 13:39:33 2013 @@ -19,8 +19,6 @@ package org.apache.sling.ide.impl.vlt; import javax.jcr.Credentials; import javax.jcr.Node; import javax.jcr.NodeIterator; -import javax.jcr.Property; -import javax.jcr.PropertyIterator; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; @@ -49,29 +47,10 @@ public class ListChildrenCommand extends continue; } - parent.addChild(nodeToResource(childNode)); } return parent; } - private ResourceProxy nodeToResource(Node node) throws RepositoryException { - - ResourceProxy resource = new ResourceProxy(node.getPath()); - PropertyIterator properties = node.getProperties(); - while (properties.hasNext()) { - Property property = properties.nextProperty(); - String propertyName = property.getName(); - Object propertyValue = ConversionUtils.getPropertyValue(property); - - if (propertyValue != null) { - resource.addProperty(propertyName, propertyValue); - } - } - - return resource; - - } - } Added: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/RepositoryUtils.java URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/RepositoryUtils.java?rev=1520302&view=auto ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/RepositoryUtils.java (added) +++ sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/RepositoryUtils.java Thu Sep 5 13:39:33 2013 @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.sling.ide.impl.vlt; + +import java.net.URISyntaxException; + +import javax.jcr.Credentials; +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.SimpleCredentials; + +import org.apache.jackrabbit.vault.fs.api.RepositoryAddress; +import org.apache.jackrabbit.vault.util.RepositoryProvider; +import org.apache.sling.ide.transport.RepositoryInfo; + +public abstract class RepositoryUtils { + + private static final RepositoryProvider REPOSITORY_PROVIDER = new RepositoryProvider(); + + public static Repository getRepository(RepositoryInfo repositoryInfo) throws RepositoryException { + + return REPOSITORY_PROVIDER.getRepository(getRepositoryAddress(repositoryInfo)); + } + + public static RepositoryAddress getRepositoryAddress(RepositoryInfo repositoryInfo) { + RepositoryAddress address; + try { + // TODO proper error handling + String url = repositoryInfo.getUrl() + "server/-/jcr:root/"; + // TODO this should be configurable, or even better - automatically discovered + address = new RepositoryAddress(url); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + return address; + } + + public static Credentials getCredentials(RepositoryInfo repositoryInfo) { + + return new SimpleCredentials(repositoryInfo.getUsername(), repositoryInfo.getPassword().toCharArray()); + } + + private RepositoryUtils() { + + } +} Propchange: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/RepositoryUtils.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/RepositoryUtils.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Rev URL Copied: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/VaultFsLocator.java (from r1514762, sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java) URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/VaultFsLocator.java?p2=sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/VaultFsLocator.java&p1=sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java&r1=1514762&r2=1520302&rev=1520302&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/VaultFsLocator.java Thu Sep 5 13:39:33 2013 @@ -14,21 +14,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.sling.ide.serialization; +package org.apache.sling.ide.impl.vlt; import java.io.IOException; -import java.io.InputStream; -import java.util.Map; -public interface SerializationManager { +import javax.jcr.RepositoryException; +import javax.jcr.Session; - boolean isSerializationFile(String filePath); +import org.apache.jackrabbit.vault.fs.api.RepositoryAddress; +import org.apache.jackrabbit.vault.fs.api.VaultFileSystem; - String getBaseResourcePath(String serializationFilePath); - - String getSerializationFilePath(String baseFilePath); +/** + * The <tt>VaultFsLocator</tt> locates {@linkplain VaultFileSystem} instances + * + */ +public interface VaultFsLocator { - String buildSerializationData(Map<String, Object> content) throws IOException; + VaultFileSystem getFileSystem(RepositoryAddress repositoryAddress, Session session) + throws RepositoryException, IOException; - Map<String, Object> readSerializationData(InputStream source) throws IOException; } Copied: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/VaultFsLocatorImpl.java (from r1514762, sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java) URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/VaultFsLocatorImpl.java?p2=sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/VaultFsLocatorImpl.java&p1=sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java&r1=1514762&r2=1520302&rev=1520302&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/VaultFsLocatorImpl.java Thu Sep 5 13:39:33 2013 @@ -14,21 +14,25 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.sling.ide.serialization; +package org.apache.sling.ide.impl.vlt; import java.io.IOException; -import java.io.InputStream; -import java.util.Map; -public interface SerializationManager { +import javax.jcr.RepositoryException; +import javax.jcr.Session; - boolean isSerializationFile(String filePath); +import org.apache.jackrabbit.vault.fs.Mounter; +import org.apache.jackrabbit.vault.fs.api.RepositoryAddress; +import org.apache.jackrabbit.vault.fs.api.VaultFileSystem; + +public class VaultFsLocatorImpl implements VaultFsLocator { + + @Override + public VaultFileSystem getFileSystem(RepositoryAddress repositoryAddress, Session session) + throws RepositoryException, IOException { + + // TODO - supply filter and config + return Mounter.mount(null, null, repositoryAddress, "/", session); + } - String getBaseResourcePath(String serializationFilePath); - - String getSerializationFilePath(String baseFilePath); - - String buildSerializationData(Map<String, Object> content) throws IOException; - - Map<String, Object> readSerializationData(InputStream source) throws IOException; } Modified: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/VltRepository.java URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/VltRepository.java?rev=1520302&r1=1520301&r2=1520302&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/VltRepository.java (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/VltRepository.java Thu Sep 5 13:39:33 2013 @@ -1,14 +1,10 @@ package org.apache.sling.ide.impl.vlt; -import java.net.URISyntaxException; import java.util.Map; import javax.jcr.Credentials; import javax.jcr.RepositoryException; -import javax.jcr.SimpleCredentials; -import org.apache.jackrabbit.vault.fs.api.RepositoryAddress; -import org.apache.jackrabbit.vault.util.RepositoryProvider; import org.apache.sling.ide.transport.Command; import org.apache.sling.ide.transport.FileInfo; import org.apache.sling.ide.transport.Repository; @@ -27,8 +23,6 @@ public class VltRepository implements Re private javax.jcr.Repository jcrRepo; private EventAdmin eventAdmin; - - private final RepositoryProvider rp = new RepositoryProvider(); private Credentials credentials; @Override @@ -39,18 +33,14 @@ public class VltRepository implements Re initJcrRepo(); } + public RepositoryInfo getRepositoryInfo() { + return repositoryInfo; + } + private void initJcrRepo() { try { - // TODO proper error handling - String url = repositoryInfo.getUrl()+ "server/-/jcr:root/"; - // TODO this should be configurable, or even better - automatically discovered - RepositoryAddress repositoryAddress = new RepositoryAddress(url); - jcrRepo = rp.getRepository(repositoryAddress); - - credentials = new SimpleCredentials(repositoryInfo.getUsername(), repositoryInfo.getPassword() - .toCharArray()); - } catch (URISyntaxException e) { - throw new RuntimeException(e); + jcrRepo = RepositoryUtils.getRepository(repositoryInfo); + credentials = RepositoryUtils.getCredentials(repositoryInfo); } catch (RepositoryException e) { throw new RuntimeException(e); } @@ -81,7 +71,7 @@ public class VltRepository implements Re } @Override - public Command<Map<String, Object>> newGetNodeContentCommand(String path) { + public Command<ResourceProxy> newGetNodeContentCommand(String path) { return TracingCommand.wrap(new GetNodeContentCommand(jcrRepo, credentials, path), eventAdmin); } Added: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java?rev=1520302&view=auto ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java (added) +++ sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java Thu Sep 5 13:39:33 2013 @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.sling.ide.impl.vlt.serialization; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + +import javax.jcr.Credentials; +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +import org.apache.jackrabbit.vault.fs.api.Aggregate; +import org.apache.jackrabbit.vault.fs.api.RepositoryAddress; +import org.apache.jackrabbit.vault.fs.api.VaultFile; +import org.apache.jackrabbit.vault.fs.api.VaultFileSystem; +import org.apache.jackrabbit.vault.fs.impl.io.DocViewSerializer; +import org.apache.jackrabbit.vault.util.Constants; +import org.apache.sling.ide.impl.vlt.RepositoryUtils; +import org.apache.sling.ide.impl.vlt.VaultFsLocator; +import org.apache.sling.ide.serialization.SerializationManager; +import org.apache.sling.ide.transport.RepositoryInfo; +import org.apache.sling.ide.transport.ResourceProxy; + +public class VltSerializationManager implements SerializationManager { + + private VaultFsLocator fsLocator; + + @Override + public boolean isSerializationFile(String filePath) { + return new File(filePath).getName().equals(Constants.DOT_CONTENT_XML); + } + + @Override + public String getBaseResourcePath(String serializationFilePath) { + // TODO + return null; + } + + @Override + public String getSerializationFilePath(String baseFilePath) { + // TODO - validate if this is correct + return baseFilePath + File.separatorChar + Constants.DOT_CONTENT_XML; + } + + protected void bindVaultFsLocator(VaultFsLocator fsLocator) { + + this.fsLocator = fsLocator; + } + + protected void unbindVaultFsLocator(VaultFsLocator fsLocator) { + + this.fsLocator = null; + } + + @Override + public String buildSerializationData(ResourceProxy resource, RepositoryInfo repositoryInfo) throws IOException { + + // TODO - there might be a performance problem with getting the session on-demand each time + Session session = null; + try { + + Repository repo = RepositoryUtils.getRepository(repositoryInfo); + Credentials credentials = RepositoryUtils.getCredentials(repositoryInfo); + + session = repo.login(credentials); + + RepositoryAddress address = RepositoryUtils.getRepositoryAddress(repositoryInfo); + + VaultFileSystem fs = fsLocator.getFileSystem(address, session); + + VaultFile vaultFile = fs.getFile(resource.getPath()); + if (vaultFile == null) { + // TODO proper logging ; discover if this is expected or not + System.err.println("No vaultFile at path " + resource.getPath()); + return null; + } + + Aggregate aggregate = vaultFile.getAggregate(); + if (aggregate == null) + throw new IllegalArgumentException("No aggregate found for path " + resource.getPath()); + + DocViewSerializer s = new DocViewSerializer(aggregate); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + s.writeContent(out); + + String stringResult = out.toString("UTF-8"); + if (stringResult.isEmpty()) + return null; + return stringResult; + + } catch (RepositoryException e) { + throw new RuntimeException(e); + } finally { + if (session != null) { + session.logout(); + } + } + } + + @Override + public Map<String, Object> readSerializationData(InputStream source) throws IOException { + return null; + } +} Propchange: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Rev URL Modified: sling/branches/tooling-ide-vlt/tooling/ide/target-definition/org.apache.sling.ide.target-definition.target URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/target-definition/org.apache.sling.ide.target-definition.target?rev=1520302&r1=1520301&r2=1520302&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/target-definition/org.apache.sling.ide.target-definition.target (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/target-definition/org.apache.sling.ide.target-definition.target Thu Sep 5 13:39:33 2013 @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<?pde version="3.8"?><target name="Sling IDE Tools" sequenceNumber="11"> +<?pde version="3.8"?><target name="Sling IDE Tools" sequenceNumber="13"> <locations> <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit"> <unit id="org.eclipse.wst.server_adapters.feature.feature.group" version="3.2.100.v20110303-51EoAkF77g8HBSc"/> @@ -10,6 +10,7 @@ </location> <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit"> <unit id="org.json" version="1.0.0.v201011060100"/> +<unit id="org.apache.commons.io" version="2.0.1.v201105210651"/> <unit id="org.slf4j.api" version="1.6.4.v20120130-2120"/> <unit id="ch.qos.logback.slf4j" version="1.0.0.v20120123-1500"/> <unit id="org.apache.commons.collections" version="3.2.0.v201005080500"/> Modified: sling/branches/tooling-ide-vlt/tooling/ide/vlt-wrapper/META-INF/MANIFEST.MF URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/vlt-wrapper/META-INF/MANIFEST.MF?rev=1520302&r1=1520301&r2=1520302&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/vlt-wrapper/META-INF/MANIFEST.MF (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/vlt-wrapper/META-INF/MANIFEST.MF Thu Sep 5 13:39:33 2013 @@ -43,5 +43,9 @@ Import-Package: org.apache.commons.httpc org.apache.commons.httpclient.params;version="3.1.0", org.apache.commons.collections.map, org.apache.commons.collections.list, + org.apache.commons.logging, + org.apache.commons.codec, + org.apache.commons.io, + org.apache.commons.io.output, org.osgi.framework, org.slf4j