You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polygene.apache.org by pa...@apache.org on 2015/04/21 13:50:19 UTC
[07/18] zest-sandbox git commit: Move Qi4j related projects in a
`qi4j/` subfolder
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-jndi/src/main/java/org/qi4j/entitystore/jndi/JndiSetup.java
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-jndi/src/main/java/org/qi4j/entitystore/jndi/JndiSetup.java b/qi4j/extensions/entitystore-jndi/src/main/java/org/qi4j/entitystore/jndi/JndiSetup.java
new file mode 100644
index 0000000..7b5564e
--- /dev/null
+++ b/qi4j/extensions/entitystore-jndi/src/main/java/org/qi4j/entitystore/jndi/JndiSetup.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2009 Niclas Hedhman.
+ *
+ * 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.qi4j.entitystore.jndi;
+
+import javax.naming.directory.InitialDirContext;
+
+class JndiSetup
+{
+ InitialDirContext context;
+ String instanceVersionAttribute;
+ String lastModifiedDateAttribute;
+ Boolean isReadOnly;
+ String identityAttribute;
+ String baseDn;
+ String qualifiedTypeAttribute;
+}
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-jndi/src/main/java/org/qi4j/entitystore/jndi/JndiUow.java
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-jndi/src/main/java/org/qi4j/entitystore/jndi/JndiUow.java b/qi4j/extensions/entitystore-jndi/src/main/java/org/qi4j/entitystore/jndi/JndiUow.java
new file mode 100644
index 0000000..3685f27
--- /dev/null
+++ b/qi4j/extensions/entitystore-jndi/src/main/java/org/qi4j/entitystore/jndi/JndiUow.java
@@ -0,0 +1,239 @@
+/*
+ * Copyright 2009 Niclas Hedhman.
+ *
+ * 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.qi4j.entitystore.jndi;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import javax.naming.NamingException;
+import javax.naming.directory.Attribute;
+import javax.naming.directory.Attributes;
+import javax.naming.ldap.LdapName;
+import org.qi4j.api.association.AssociationDescriptor;
+import org.qi4j.api.common.QualifiedName;
+import org.qi4j.api.entity.EntityDescriptor;
+import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.property.PropertyDescriptor;
+import org.qi4j.api.structure.Module;
+import org.qi4j.api.usecase.Usecase;
+import org.qi4j.spi.entity.EntityState;
+import org.qi4j.spi.entity.EntityStatus;
+import org.qi4j.spi.entitystore.EntityNotFoundException;
+import org.qi4j.spi.entitystore.EntityStoreException;
+import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
+import org.qi4j.spi.entitystore.ReadOnlyEntityStoreException;
+import org.qi4j.spi.entitystore.StateCommitter;
+
+public class JndiUow implements EntityStoreUnitOfWork
+{
+ private static final ArrayList<String> RESTRICTED_PROPERTIES = new ArrayList<String>();
+
+ static
+ {
+ RESTRICTED_PROPERTIES.add( "identity" );
+ }
+
+ private long currentTime;
+ private Usecase usecase;
+ private Module module;
+ private String uowIdentity;
+ private JndiSetup setup;
+
+ public JndiUow( JndiSetup setup, Usecase usecase, Module module, long currentTime )
+ {
+ this.setup = setup;
+ uowIdentity = UUID.randomUUID().toString();
+ this.usecase = usecase;
+ this.module = module;
+ this.currentTime = currentTime;
+ }
+
+ public String identity()
+ {
+ return uowIdentity;
+ }
+
+ public long currentTime()
+ {
+ return currentTime;
+ }
+
+ public EntityState newEntityState( EntityReference anIdentity, EntityDescriptor entityDescriptor )
+ throws EntityStoreException
+ {
+ throw new ReadOnlyEntityStoreException( "JndiEntityStore is read-only." );
+ }
+
+ public EntityState entityStateOf( EntityReference identity )
+ throws EntityStoreException, EntityNotFoundException
+ {
+ try
+ {
+ String id = identity.identity();
+ Attributes attrs = lookup( id );
+
+ String version = Long.toString( getVersion( attrs ) );
+ long lastModified = getLastModified( attrs );
+ EntityStatus status = EntityStatus.LOADED;
+ EntityDescriptor descriptor = module.entityDescriptor( getType( attrs ) );
+ Map<QualifiedName, Object> properties = getProperties( attrs, descriptor );
+ Map<QualifiedName, EntityReference> associations = getAssociations( attrs, descriptor );
+ Map<QualifiedName, List<EntityReference>> manyAssocations = getManyAssociations( attrs, descriptor );
+ return new JndiEntityState( this,
+ version,
+ lastModified,
+ identity,
+ status,
+ descriptor,
+ properties,
+ associations,
+ manyAssocations );
+ }
+ catch( NamingException e )
+ {
+ throw new EntityStoreException( e );
+ }
+ }
+
+ public StateCommitter applyChanges()
+ throws EntityStoreException
+ {
+ return new StateCommitter()
+ {
+ public void commit()
+ {
+ }
+
+ public void cancel()
+ {
+ }
+ };
+ }
+
+ public void discard()
+ {
+ }
+
+ private Attributes lookup( String id )
+ throws NamingException
+ {
+ // TODO: Caching
+ LdapName dn = new LdapName( setup.identityAttribute + "=" + id + "," + setup.baseDn );
+ return setup.context.getAttributes( dn );
+ }
+
+
+ private String getType( Attributes attrs )
+ throws NamingException
+ {
+ Attribute typeAttr = attrs.get( setup.qualifiedTypeAttribute );
+ if( typeAttr == null )
+ {
+ return null;
+ }
+ return (String) typeAttr.get();
+ }
+
+ private long getLastModified( Attributes attrs )
+ throws NamingException
+ {
+ Attribute lastModifiedAttr = attrs.get( setup.lastModifiedDateAttribute );
+ if( lastModifiedAttr == null )
+ {
+ return -1;
+ }
+ String lastModifiedValue = (String) lastModifiedAttr.get();
+ return Long.parseLong( lastModifiedValue );
+ }
+
+ private long getVersion( Attributes attrs )
+ throws NamingException
+ {
+ Attribute versionAttr = attrs.get( setup.instanceVersionAttribute );
+ if( versionAttr == null )
+ {
+ return -1;
+ }
+ String versionValue = (String) versionAttr.get();
+ return Long.parseLong( versionValue );
+ }
+
+
+ private Map<QualifiedName, Object> getProperties( Attributes attrs, EntityDescriptor entityType )
+ throws NamingException
+ {
+ Map<QualifiedName, Object> result = new HashMap<QualifiedName, Object>();
+ for( PropertyDescriptor property : entityType.state().properties() )
+ {
+ QualifiedName qualifiedName = property.qualifiedName();
+ String propertyName = qualifiedName.name();
+ if( !RESTRICTED_PROPERTIES.contains( propertyName ) )
+ {
+ Attribute attribute = attrs.get( propertyName );
+ if( attribute != null )
+ {
+ result.put( qualifiedName, attribute.get() );
+ }
+ }
+ }
+ return result;
+ }
+
+ private Map<QualifiedName, EntityReference> getAssociations( Attributes attrs, EntityDescriptor entityType )
+ throws NamingException
+ {
+ Map<QualifiedName, EntityReference> result = new HashMap<QualifiedName, EntityReference>();
+ for( AssociationDescriptor associationType : entityType.state().associations() )
+ {
+ QualifiedName qualifiedName = associationType.qualifiedName();
+ String associationName = qualifiedName.name();
+ Attribute attribute = attrs.get( associationName );
+ String identity = (String) attribute.get();
+ EntityReference entityReference = EntityReference.parseEntityReference( identity );
+ result.put( qualifiedName, entityReference );
+ }
+ return result;
+ }
+
+ private Map<QualifiedName, List<EntityReference>> getManyAssociations( Attributes attrs, EntityDescriptor entityType )
+ throws NamingException
+ {
+ Map<QualifiedName, List<EntityReference>> result = new HashMap<QualifiedName, List<EntityReference>>();
+ for( AssociationDescriptor associationType : entityType.state().manyAssociations() )
+ {
+ QualifiedName qualifiedName = associationType.qualifiedName();
+ String associationName = qualifiedName.name();
+ Attribute attribute = attrs.get( associationName );
+ String identity = (String) attribute.get();
+ EntityReference entityRef = new EntityReference( identity );
+ List<EntityReference> entry = result.get( qualifiedName );
+ if( entry == null )
+ {
+ entry = new ArrayList<EntityReference>();
+ result.put( qualifiedName, entry );
+ }
+ entry.add( entityRef );
+ }
+ return result;
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-jndi/src/test/java/org/qi4j/entitystore/jndi/Group.java
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-jndi/src/test/java/org/qi4j/entitystore/jndi/Group.java b/qi4j/extensions/entitystore-jndi/src/test/java/org/qi4j/entitystore/jndi/Group.java
new file mode 100644
index 0000000..39f0977
--- /dev/null
+++ b/qi4j/extensions/entitystore-jndi/src/test/java/org/qi4j/entitystore/jndi/Group.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2009 Niclas Hedhman.
+ *
+ * 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.qi4j.entitystore.jndi;
+
+import org.qi4j.api.property.Property;
+
+public interface Group
+{
+ Property<String> uid();
+
+}
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-jndi/src/test/java/org/qi4j/entitystore/jndi/GroupEntity.java
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-jndi/src/test/java/org/qi4j/entitystore/jndi/GroupEntity.java b/qi4j/extensions/entitystore-jndi/src/test/java/org/qi4j/entitystore/jndi/GroupEntity.java
new file mode 100644
index 0000000..f000532
--- /dev/null
+++ b/qi4j/extensions/entitystore-jndi/src/test/java/org/qi4j/entitystore/jndi/GroupEntity.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2009 Niclas Hedhman.
+ *
+ * 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.qi4j.entitystore.jndi;
+
+import org.qi4j.api.entity.EntityComposite;
+
+public interface GroupEntity extends Group, EntityComposite
+{
+}
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-jndi/src/test/java/org/qi4j/entitystore/jndi/JndiReadEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-jndi/src/test/java/org/qi4j/entitystore/jndi/JndiReadEntityStoreTest.java b/qi4j/extensions/entitystore-jndi/src/test/java/org/qi4j/entitystore/jndi/JndiReadEntityStoreTest.java
new file mode 100644
index 0000000..1e57060
--- /dev/null
+++ b/qi4j/extensions/entitystore-jndi/src/test/java/org/qi4j/entitystore/jndi/JndiReadEntityStoreTest.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2009 Niclas Hedhman.
+ *
+ * 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.qi4j.entitystore.jndi;
+
+import org.junit.Test;
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.qi4j.api.common.Visibility;
+import org.qi4j.api.unitofwork.UnitOfWork;
+import org.qi4j.bootstrap.AssemblyException;
+import org.qi4j.bootstrap.ModuleAssembly;
+import org.qi4j.spi.uuid.UuidIdentityGeneratorService;
+import org.qi4j.test.AbstractQi4jTest;
+
+import javax.naming.directory.Attributes;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.InitialDirContext;
+import org.qi4j.api.value.ValueSerialization;
+import org.qi4j.test.EntityTestAssembler;
+import org.qi4j.valueserialization.orgjson.OrgJsonValueSerializationService;
+
+public class JndiReadEntityStoreTest extends AbstractQi4jTest
+{
+ public void assemble( ModuleAssembly module ) throws AssemblyException
+ {
+ module.services( JndiEntityStoreService.class, UuidIdentityGeneratorService.class );
+ module.services( OrgJsonValueSerializationService.class ).taggedWith( ValueSerialization.Formats.JSON );
+ ModuleAssembly config = module.layer().module( "config" );
+ config.entities( JndiConfiguration.class ).visibleIn( Visibility.layer );
+ new EntityTestAssembler().assemble( config );
+
+ module.entities( UserEntity.class, GroupEntity.class );
+ }
+
+ @Test
+ @Ignore( "Requires connection to LDAP server on OPS4J that is now unavailable" )
+ public void findSaslSupportTypes()
+ throws Exception
+ {
+ // Create initial context
+ DirContext ctx = new InitialDirContext();
+
+ // Read supportedSASLMechanisms from root DSE
+ Attributes attrs = ctx.getAttributes(
+ "ldap://srv07.ops4j.org:389", new String[]{ "supportedSASLMechanisms" } );
+
+ System.out.println( attrs );
+ }
+
+ @Test
+ @Ignore
+ public void testReadNiclasFromLdap()
+ throws Exception
+ {
+ UnitOfWork uow = module.newUnitOfWork();
+ try
+ {
+ User user = uow.get( User.class, "niclas.hedhman" );
+ System.out.println( user.givenName().get() + " " + user.sn().get() );
+ Assert.assertEquals( "Niclas", user.givenName().get() );
+ }
+ finally
+ {
+ uow.discard();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-jndi/src/test/java/org/qi4j/entitystore/jndi/User.java
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-jndi/src/test/java/org/qi4j/entitystore/jndi/User.java b/qi4j/extensions/entitystore-jndi/src/test/java/org/qi4j/entitystore/jndi/User.java
new file mode 100644
index 0000000..a656c56
--- /dev/null
+++ b/qi4j/extensions/entitystore-jndi/src/test/java/org/qi4j/entitystore/jndi/User.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2009 Niclas Hedhman.
+ *
+ * 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.qi4j.entitystore.jndi;
+
+import org.qi4j.api.property.Property;
+
+public interface User
+{
+ Property<String> sn();
+
+ Property<String> givenName();
+}
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-jndi/src/test/java/org/qi4j/entitystore/jndi/UserEntity.java
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-jndi/src/test/java/org/qi4j/entitystore/jndi/UserEntity.java b/qi4j/extensions/entitystore-jndi/src/test/java/org/qi4j/entitystore/jndi/UserEntity.java
new file mode 100644
index 0000000..84ef3e5
--- /dev/null
+++ b/qi4j/extensions/entitystore-jndi/src/test/java/org/qi4j/entitystore/jndi/UserEntity.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2009 Niclas Hedhman.
+ *
+ * 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.qi4j.entitystore.jndi;
+
+import org.qi4j.api.entity.EntityComposite;
+
+public interface UserEntity extends User, EntityComposite
+{
+}
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-jndi/src/test/resources/org/qi4j/entitystore/jndi/JndiEntityStoreService.properties
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-jndi/src/test/resources/org/qi4j/entitystore/jndi/JndiEntityStoreService.properties b/qi4j/extensions/entitystore-jndi/src/test/resources/org/qi4j/entitystore/jndi/JndiEntityStoreService.properties
new file mode 100644
index 0000000..3d41382
--- /dev/null
+++ b/qi4j/extensions/entitystore-jndi/src/test/resources/org/qi4j/entitystore/jndi/JndiEntityStoreService.properties
@@ -0,0 +1,59 @@
+# Copyright 2008 Niclas Hedhman.
+#
+# 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.
+
+readOnly=true
+
+# versionAttribute=instanceVersion
+
+# qualifiedTypeAttribute
+
+# turboMode=false
+
+baseDN=ou=qi4jdev
+
+# propertyAttribute=
+
+identityAttribute=cn
+
+# authorative=false
+
+# batchSize=
+
+# controlFactories=
+
+# dnsUrl=
+
+# initialContextFactory=
+
+# language=
+
+# objectFactories=
+
+providerUrl=ldap://srv07.ops4j.org:389/dc=codedragons,dc=com
+
+# referral=
+
+# securityAuthentication=
+
+securityCredentials=HappyGoLucky
+
+securityPrincipal=cn=_tester,ou=qi4jdev,dc=codedragons,dc=com
+
+# securityProtocol=
+
+# stateFactories=
+
+# urlPkgPrefixes=
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-rmi/dev-status.xml
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-rmi/dev-status.xml b/qi4j/extensions/entitystore-rmi/dev-status.xml
new file mode 100644
index 0000000..0c93156
--- /dev/null
+++ b/qi4j/extensions/entitystore-rmi/dev-status.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<module xmlns="http://www.qi4j.org/schemas/2008/dev-status/1">
+ <status>
+ <codebase>early</codebase>
+ <!--none,early,beta,stable,mature-->
+ <documentation>none</documentation>
+ <!-- none, brief, good, complete -->
+ <unittests>some</unittests>
+ <!-- none, some, good, complete -->
+ </status>
+ <licenses>
+ <license>ALv2</license>
+ </licenses>
+</module>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-rmi/osgi.bundle
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-rmi/osgi.bundle b/qi4j/extensions/entitystore-rmi/osgi.bundle
new file mode 100644
index 0000000..66452e5
--- /dev/null
+++ b/qi4j/extensions/entitystore-rmi/osgi.bundle
@@ -0,0 +1,26 @@
+Bundle-Activator:
+
+Private-Package:
+
+Ignore-Package: com_cenqua_clover
+
+Import-Package: org.qi4j.api.composite, \
+ org.qi4j.api.common, \
+ org.qi4j.api.configuration, \
+ org.qi4j.api.entity, \
+ org.qi4j.api.injection.scope, \
+ org.qi4j.api.io, \
+ org.qi4j.api.mixin, \
+ org.qi4j.api.property, \
+ org.qi4j.api.service, \
+ org.qi4j.entitystore.map, \
+ org.qi4j.library.locking, \
+ org.qi4j.spi, \
+ org.qi4j.spi.composite, \
+ org.qi4j.spi.entity, \
+ org.qi4j.spi.entity.helpers, \
+ org.qi4j.spi.entitystore, \
+ org.qi4j.spi.service, \
+ org.qi4j.api.structure
+
+Export-Package: org.qi4j.entitystore.rmi
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-rmi/pom.xml
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-rmi/pom.xml b/qi4j/extensions/entitystore-rmi/pom.xml
new file mode 100644
index 0000000..1a5640b
--- /dev/null
+++ b/qi4j/extensions/entitystore-rmi/pom.xml
@@ -0,0 +1,44 @@
+<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>
+ <parent>
+ <groupId>org.qi4j.sandbox</groupId>
+ <artifactId>qi4j-sandbox-extensions</artifactId>
+ <version>0-SNAPSHOT</version>
+ </parent>
+ <groupId>org.qi4j.extension</groupId>
+ <artifactId>qi4j-entitystore-rmi</artifactId>
+ <name>Qi4j Extension - EntityStore - RMI</name>
+ <packaging>jar</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.qi4j.core</groupId>
+ <artifactId>org.qi4j.core.api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.qi4j.core</groupId>
+ <artifactId>org.qi4j.core.spi</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.qi4j.core</groupId>
+ <artifactId>org.qi4j.core.bootstrap</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.qi4j.library</groupId>
+ <artifactId>org.qi4j.library.locking</artifactId>
+ </dependency>
+
+ <!-- For tests -->
+ <dependency>
+ <groupId>org.qi4j.core</groupId>
+ <artifactId>org.qi4j.core.testsupport</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.qi4j.core</groupId>
+ <artifactId>org.qi4j.core.runtime</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/ClientRmiEntityStoreMixin.java
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/ClientRmiEntityStoreMixin.java b/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/ClientRmiEntityStoreMixin.java
new file mode 100644
index 0000000..a44105b
--- /dev/null
+++ b/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/ClientRmiEntityStoreMixin.java
@@ -0,0 +1,77 @@
+/* Copyright 2008 Rickard Öberg.
+ *
+ * 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.qi4j.entitystore.rmi;
+
+import org.qi4j.api.entity.EntityReference;
+import org.qi4j.io.Input;
+import org.qi4j.io.Output;
+import org.qi4j.spi.entitystore.EntityStoreException;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.rmi.registry.LocateRegistry;
+import java.rmi.registry.Registry;
+import org.qi4j.api.service.ServiceActivation;
+import org.qi4j.spi.entitystore.helpers.MapEntityStore;
+
+/**
+ * RMI client implementation of Entity
+ */
+public class ClientRmiEntityStoreMixin
+ implements ServiceActivation, MapEntityStore
+{
+ private RemoteEntityStore remote;
+
+ // Activatable implementation
+ public void activateService()
+ throws Exception
+ {
+ Registry registry = LocateRegistry.getRegistry( "localhost" );
+ remote = (RemoteEntityStore) registry.lookup( ServerRmiEntityStoreService.class.getSimpleName() );
+ }
+
+ public void passivateService()
+ throws Exception
+ {
+ remote = null;
+ }
+
+ public Reader get( EntityReference entityReference )
+ throws EntityStoreException
+ {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public Input<Reader, IOException> entityStates()
+ {
+ return new Input<Reader, IOException>()
+ {
+ public <ReceiverThrowableType extends Throwable> void transferTo( Output<? super Reader, ReceiverThrowableType> output )
+ throws IOException, ReceiverThrowableType
+ {
+ // TODO Implement this
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+ };
+ }
+
+ public void applyChanges( MapChanges changes )
+ throws IOException
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/ClientRmiEntityStoreService.java
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/ClientRmiEntityStoreService.java b/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/ClientRmiEntityStoreService.java
new file mode 100644
index 0000000..f46424c
--- /dev/null
+++ b/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/ClientRmiEntityStoreService.java
@@ -0,0 +1,32 @@
+/* Copyright 2008 Rickard Öberg.
+ *
+ * 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.qi4j.entitystore.rmi;
+
+import org.qi4j.api.mixin.Mixins;
+import org.qi4j.api.service.ServiceActivation;
+import org.qi4j.library.locking.LockingAbstractComposite;
+import org.qi4j.spi.entitystore.EntityStore;
+
+/**
+ * EntityStore service for remote access of another EntityStore.
+ */
+
+@Mixins( { ClientRmiEntityStoreMixin.class } )
+public interface ClientRmiEntityStoreService
+ extends EntityStore, ServiceActivation, LockingAbstractComposite
+{
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/RegistryConfiguration.java
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/RegistryConfiguration.java b/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/RegistryConfiguration.java
new file mode 100644
index 0000000..a2eaa8b
--- /dev/null
+++ b/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/RegistryConfiguration.java
@@ -0,0 +1,13 @@
+package org.qi4j.entitystore.rmi;
+
+import org.qi4j.api.configuration.ConfigurationComposite;
+import org.qi4j.api.property.Property;
+
+/**
+ * JAVADOC
+ */
+public interface RegistryConfiguration
+ extends ConfigurationComposite
+{
+ Property<Integer> port();
+}
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/RegistryMixin.java
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/RegistryMixin.java b/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/RegistryMixin.java
new file mode 100644
index 0000000..198e11f
--- /dev/null
+++ b/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/RegistryMixin.java
@@ -0,0 +1,53 @@
+package org.qi4j.entitystore.rmi;
+
+import org.qi4j.api.common.AppliesTo;
+import org.qi4j.api.configuration.Configuration;
+import org.qi4j.api.injection.scope.This;
+import org.qi4j.api.service.ServiceActivation;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.rmi.RemoteException;
+import java.rmi.registry.LocateRegistry;
+import java.rmi.registry.Registry;
+import java.rmi.server.UnicastRemoteObject;
+
+/**
+ * Create and delegate to a RMI registry.
+ */
+@AppliesTo( { Registry.class, ServiceActivation.class } )
+public class RegistryMixin
+ implements InvocationHandler, ServiceActivation
+{
+ Registry registry;
+
+ @This Configuration<RegistryConfiguration> config;
+
+ public void activateService() throws Exception
+ {
+ try
+ {
+ Integer port = config.get().port().get();
+ registry = LocateRegistry.createRegistry( port );
+ }
+ catch( RemoteException e )
+ {
+ registry = LocateRegistry.getRegistry();
+ }
+ }
+
+ public void passivateService() throws Exception
+ {
+ for( String boundService : registry.list() )
+ {
+ registry.unbind( boundService );
+ }
+ UnicastRemoteObject.unexportObject( registry, true );
+ }
+
+ public Object invoke( Object o, Method method, Object[] objects ) throws Throwable
+ {
+ return method.invoke( registry, objects );
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/RegistryService.java
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/RegistryService.java b/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/RegistryService.java
new file mode 100644
index 0000000..7adbc7d
--- /dev/null
+++ b/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/RegistryService.java
@@ -0,0 +1,15 @@
+package org.qi4j.entitystore.rmi;
+
+import org.qi4j.api.mixin.Mixins;
+import org.qi4j.api.service.ServiceActivation;
+
+import java.rmi.registry.Registry;
+
+/**
+ * RMI Registry service
+ */
+@Mixins( RegistryMixin.class )
+public interface RegistryService
+ extends ServiceActivation, Registry
+{
+}
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/RemoteEntityStore.java
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/RemoteEntityStore.java b/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/RemoteEntityStore.java
new file mode 100644
index 0000000..0e91190
--- /dev/null
+++ b/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/RemoteEntityStore.java
@@ -0,0 +1,20 @@
+package org.qi4j.entitystore.rmi;
+
+import java.io.IOException;
+import java.rmi.Remote;
+import org.qi4j.spi.entity.EntityState;
+import org.qi4j.spi.entity.QualifiedIdentity;
+import org.qi4j.spi.entitystore.ConcurrentEntityStateModificationException;
+
+/**
+ * Interface for remote EntityStore
+ */
+public interface RemoteEntityStore
+ extends Remote
+{
+ EntityState getEntityState( QualifiedIdentity identity )
+ throws IOException;
+
+ void prepare( Iterable<EntityState> newStates, Iterable<EntityState> loadedStates, Iterable<QualifiedIdentity> removedStates )
+ throws IOException, ConcurrentEntityStateModificationException;
+}
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/ServerRemoteEntityStoreMixin.java
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/ServerRemoteEntityStoreMixin.java b/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/ServerRemoteEntityStoreMixin.java
new file mode 100644
index 0000000..93c2e59
--- /dev/null
+++ b/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/ServerRemoteEntityStoreMixin.java
@@ -0,0 +1,216 @@
+/* Copyright 2008 Rickard Öberg.
+ *
+ * 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.qi4j.entitystore.rmi;
+
+import java.io.IOException;
+import java.rmi.registry.Registry;
+import java.rmi.server.UnicastRemoteObject;
+import java.util.concurrent.locks.ReadWriteLock;
+import org.qi4j.api.injection.scope.Service;
+import org.qi4j.api.injection.scope.Structure;
+import org.qi4j.api.injection.scope.This;
+import org.qi4j.api.injection.scope.Uses;
+import org.qi4j.api.service.ServiceActivation;
+import org.qi4j.api.service.ServiceDescriptor;
+import org.qi4j.api.service.ServiceReference;
+import org.qi4j.api.structure.Module;
+import org.qi4j.library.locking.WriteLock;
+import org.qi4j.spi.Qi4jSPI;
+import org.qi4j.spi.entity.EntityState;
+import org.qi4j.spi.entity.QualifiedIdentity;
+import org.qi4j.spi.entitystore.EntityStore;
+import org.qi4j.spi.entitystore.EntityStoreException;
+
+/**
+ * RMI server implementation of EntityStore
+ */
+public class ServerRemoteEntityStoreMixin
+ implements RemoteEntityStore, ServiceActivation
+{
+ @Uses
+ private ServiceDescriptor descriptor;
+
+ @This
+ private RemoteEntityStore remote;
+
+ @This
+ private ReadWriteLock lock;
+
+ @Structure
+ private Module module;
+
+ @Structure
+ private Qi4jSPI spi;
+
+ @Service
+ private EntityStore entityStore;
+
+ @Service
+ private ServiceReference<Registry> registry;
+
+ // Activatable implementation
+ public void activateService()
+ throws Exception
+ {
+ RemoteEntityStore stub = (RemoteEntityStore) UnicastRemoteObject.exportObject( remote, 0 );
+ registry.get().bind( descriptor.identity(), stub );
+ }
+
+ public void passivateService()
+ throws Exception
+ {
+ if( registry.isActive() )
+ {
+ registry.get().unbind( descriptor.identity() );
+ }
+ UnicastRemoteObject.unexportObject( remote, true );
+ }
+
+ // EntityStore implementation
+ @WriteLock
+ public EntityState getEntityState( QualifiedIdentity identity )
+ throws IOException
+ {
+// EntityState state = getEntityState( entityStore, identity );
+//
+// Map<QualifiedName, Object> properties = copyProperties( state );
+// Map<QualifiedName, QualifiedIdentity> associations = copyAssociations( state );
+// Map<QualifiedName, Collection<QualifiedIdentity>> manyAssociations = copyManyAssociations( state );
+//
+// return new DefaultEntityState( state.version(),
+// state.lastModified(),
+// identity,
+// state.status(),
+// getEntityType( identity ),
+// properties,
+// associations,
+// manyAssociations );
+ return null;
+ }
+
+// private Map<QualifiedName, Collection<QualifiedIdentity>> copyManyAssociations( EntityState state )
+// {
+// Map<QualifiedName, Collection<QualifiedIdentity>> manyAssociations = new HashMap<QualifiedName, Collection<QualifiedIdentity>>();
+// for( QualifiedName associationName : state.manyAssociationNames() )
+// {
+// Collection<QualifiedIdentity> idCollection = state.getManyAssociation( associationName );
+// if( idCollection instanceof Set )
+// {
+// Set<QualifiedIdentity> collectionCopy = new HashSet<QualifiedIdentity>( idCollection );
+// manyAssociations.put( associationName, collectionCopy );
+// }
+// else if( idCollection instanceof List )
+// {
+// List<QualifiedIdentity> collectionCopy = new ArrayList<QualifiedIdentity>( idCollection );
+// manyAssociations.put( associationName, collectionCopy );
+// }
+// }
+// return manyAssociations;
+// }
+
+// private Map<QualifiedName, QualifiedIdentity> copyAssociations( EntityState state )
+// {
+// Map<QualifiedName, QualifiedIdentity> associations = new HashMap<QualifiedName, QualifiedIdentity>();
+// for( QualifiedName associationName : state.associationNames() )
+// {
+// QualifiedIdentity id = state.getAssociation( associationName );
+// associations.put( associationName, id );
+// }
+// return associations;
+// }
+//
+// private Map<QualifiedName, Object> copyProperties( EntityState state )
+// {
+// Map<QualifiedName, Object> properties = new HashMap<QualifiedName, Object>();
+// for( QualifiedName propertyName : state.propertyNames() )
+// {
+// Object value = state.getProperty( propertyName );
+// properties.put( propertyName, value );
+// }
+// return properties;
+// }
+
+// private EntityType getEntityType( QualifiedIdentity identity )
+// {
+// final String typeName = identity.type();
+// try
+// {
+// return spi.getEntityDescriptor( module.classLoader().loadClass( typeName ), module ).entityType();
+// }
+// catch( ClassNotFoundException e )
+// {
+// throw new EntityStoreException( "Error accessing CompositeType for type " + typeName, e );
+// }
+// }
+
+ public void prepare( Iterable<EntityState> newStates,
+ Iterable<EntityState> loadedStates,
+ Iterable<QualifiedIdentity> removedStates
+ )
+ {
+// lock.writeLock().lock();
+// try
+// {
+// final StateCommitter committer = entityStore.prepare( newStates, loadedStates, removedStates );
+// try
+// {
+// committer.commit();
+// }
+// catch( EntityStoreException e )
+// {
+// committer.cancel();
+// throw e;
+// }
+//
+// }
+//
+// finally
+// {
+// lock.writeLock().unlock();
+// }
+ }
+
+ public EntityState getEntityState( EntityStore entityStore, QualifiedIdentity qid )
+ throws EntityStoreException
+ {
+ EntityState entityState = null;
+// do
+// {
+// try
+// {
+// entityState = entityStore.getEntityState( qid );
+// }
+// catch( UnknownEntityTypeException e )
+// {
+// // Check if it is this type that the store doesn't understand
+// EntityType entityType = getEntityType( qid );
+// if( e.getMessage().equals( entityType.type() ) )
+// {
+// entityStore.registerEntityType( entityType );
+// // Try again
+// }
+// else
+// {
+// throw e; // ???
+// }
+// }
+// }
+// while( entityState == null );
+
+ return entityState;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/ServerRmiEntityStoreService.java
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/ServerRmiEntityStoreService.java b/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/ServerRmiEntityStoreService.java
new file mode 100644
index 0000000..f3850e6
--- /dev/null
+++ b/qi4j/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/ServerRmiEntityStoreService.java
@@ -0,0 +1,31 @@
+/* Copyright 2008 Rickard Öberg.
+ *
+ * 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.qi4j.entitystore.rmi;
+
+import org.qi4j.api.mixin.Mixins;
+import org.qi4j.api.service.ServiceActivation;
+import org.qi4j.library.locking.LockingAbstractComposite;
+
+/**
+ * EntityStore service for remote access of another EntityStore.
+ */
+
+@Mixins( { ServerRemoteEntityStoreMixin.class } )
+public interface ServerRmiEntityStoreService
+ extends ServiceActivation, LockingAbstractComposite
+{
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-rmi/src/main/resources/org/qi4j/entitystore/rmi/RegistryService.properties
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-rmi/src/main/resources/org/qi4j/entitystore/rmi/RegistryService.properties b/qi4j/extensions/entitystore-rmi/src/main/resources/org/qi4j/entitystore/rmi/RegistryService.properties
new file mode 100644
index 0000000..57e7110
--- /dev/null
+++ b/qi4j/extensions/entitystore-rmi/src/main/resources/org/qi4j/entitystore/rmi/RegistryService.properties
@@ -0,0 +1 @@
+port=1099
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-s3/.gitignore
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-s3/.gitignore b/qi4j/extensions/entitystore-s3/.gitignore
new file mode 100644
index 0000000..2f7896d
--- /dev/null
+++ b/qi4j/extensions/entitystore-s3/.gitignore
@@ -0,0 +1 @@
+target/
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-s3/LICENSE
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-s3/LICENSE b/qi4j/extensions/entitystore-s3/LICENSE
new file mode 100644
index 0000000..f433b1a
--- /dev/null
+++ b/qi4j/extensions/entitystore-s3/LICENSE
@@ -0,0 +1,177 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-s3/NOTICE
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-s3/NOTICE b/qi4j/extensions/entitystore-s3/NOTICE
new file mode 100644
index 0000000..d6d182a
--- /dev/null
+++ b/qi4j/extensions/entitystore-s3/NOTICE
@@ -0,0 +1,22 @@
+Qi4j Amazon S3 Persistence Extension
+Copyright 2007-2008, The Qi4j Development Team of individuals.
+
+See http://www.qi4j.org/contributors.html for list of of individuals.
+Also see each file for additional information of Copyright claims.
+
+Qi4j is a community aggregated works under Copyright law.
+All parts of the original works at Qi4j is licensed under the
+Apache License ver 2.0 http://www.apache.org/licenses
+
+Below follows a list of binary dependencies and their licenses;
+----------------------------------------------------------------
+
+This module uses Apache Commons Logging, software developed at The Apache
+Software Foundation (http://www.apache.org/).
+See licenses/commons-logging.license
+
+This module uses JetS3t, software developed at https://jets3t.dev.java.net/
+See licenses/jets3t.license
+
+
+END OF NOTICE
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-s3/dev-status.xml
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-s3/dev-status.xml b/qi4j/extensions/entitystore-s3/dev-status.xml
new file mode 100644
index 0000000..0c93156
--- /dev/null
+++ b/qi4j/extensions/entitystore-s3/dev-status.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<module xmlns="http://www.qi4j.org/schemas/2008/dev-status/1">
+ <status>
+ <codebase>early</codebase>
+ <!--none,early,beta,stable,mature-->
+ <documentation>none</documentation>
+ <!-- none, brief, good, complete -->
+ <unittests>some</unittests>
+ <!-- none, some, good, complete -->
+ </status>
+ <licenses>
+ <license>ALv2</license>
+ </licenses>
+</module>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-s3/licenses/commons-logging.license
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-s3/licenses/commons-logging.license b/qi4j/extensions/entitystore-s3/licenses/commons-logging.license
new file mode 100644
index 0000000..f433b1a
--- /dev/null
+++ b/qi4j/extensions/entitystore-s3/licenses/commons-logging.license
@@ -0,0 +1,177 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-s3/licenses/jets3t.license
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-s3/licenses/jets3t.license b/qi4j/extensions/entitystore-s3/licenses/jets3t.license
new file mode 100644
index 0000000..f433b1a
--- /dev/null
+++ b/qi4j/extensions/entitystore-s3/licenses/jets3t.license
@@ -0,0 +1,177 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-s3/osgi.bundle
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-s3/osgi.bundle b/qi4j/extensions/entitystore-s3/osgi.bundle
new file mode 100644
index 0000000..2156ebb
--- /dev/null
+++ b/qi4j/extensions/entitystore-s3/osgi.bundle
@@ -0,0 +1,28 @@
+Bundle-Activator:
+
+Private-Package:
+
+Ignore-Package: com_cenqua_clover
+
+Import-Package: org.jets3t.service, \
+ org.jets3t.service.impl.rest.httpclient, \
+ org.jets3t.service.model, \
+ org.qi4j.api.mixin, \
+ org.jets3t.service.security, \
+ org.qi4j.api.composite, \
+ org.qi4j.api.configuration, \
+ org.qi4j.api.entity, \
+ org.qi4j.api.injection.scope, \
+ org.qi4j.api.io, \
+ org.qi4j.entitystore.map, \
+ org.qi4j.library.locking, \
+ org.qi4j.api.property, \
+ org.qi4j.api.service, \
+ org.qi4j.spi.composite, \
+ org.qi4j.spi.entity, \
+ org.qi4j.spi.entity.helpers, \
+ org.qi4j.spi.entitystore, \
+ org.qi4j.spi.serialization, \
+ org.qi4j.api.structure
+
+Export-Package: org.qi4j.entitystore.s3
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-s3/pom.xml
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-s3/pom.xml b/qi4j/extensions/entitystore-s3/pom.xml
new file mode 100644
index 0000000..e5506ed
--- /dev/null
+++ b/qi4j/extensions/entitystore-s3/pom.xml
@@ -0,0 +1,45 @@
+<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>
+ <parent>
+ <groupId>org.qi4j.sandbox</groupId>
+ <artifactId>qi4j-sandbox-extensions</artifactId>
+ <version>0-SNAPSHOT</version>
+ </parent>
+ <groupId>org.qi4j.extension</groupId>
+ <artifactId>qi4j-entitystore-s3</artifactId>
+ <name>Qi4j Extension - EntityStore - Amazon S3</name>
+ <packaging>jar</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.qi4j.core</groupId>
+ <artifactId>org.qi4j.core.api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.qi4j.core</groupId>
+ <artifactId>org.qi4j.core.spi</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.qi4j.library</groupId>
+ <artifactId>org.qi4j.library.locking</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>net.java.dev.jets3t</groupId>
+ <artifactId>jets3t</artifactId>
+ <version>0.6.0</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <version>1.1</version>
+ </dependency>
+
+ <!-- For Tests -->
+ <dependency>
+ <groupId>org.qi4j.core</groupId>
+ <artifactId>org.qi4j.core.testsupport</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-s3/src/main/java/org/qi4j/entitystore/s3/S3Configuration.java
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-s3/src/main/java/org/qi4j/entitystore/s3/S3Configuration.java b/qi4j/extensions/entitystore-s3/src/main/java/org/qi4j/entitystore/s3/S3Configuration.java
new file mode 100644
index 0000000..1d23d15
--- /dev/null
+++ b/qi4j/extensions/entitystore-s3/src/main/java/org/qi4j/entitystore/s3/S3Configuration.java
@@ -0,0 +1,15 @@
+package org.qi4j.entitystore.s3;
+
+import org.qi4j.api.configuration.ConfigurationComposite;
+import org.qi4j.api.property.Property;
+
+/**
+ * Configuration for the Amazon S3 EntityStore
+ */
+public interface S3Configuration
+ extends ConfigurationComposite
+{
+ Property<String> accessKey();
+
+ Property<String> secretKey();
+}
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/extensions/entitystore-s3/src/main/java/org/qi4j/entitystore/s3/S3EntityStoreService.java
----------------------------------------------------------------------
diff --git a/qi4j/extensions/entitystore-s3/src/main/java/org/qi4j/entitystore/s3/S3EntityStoreService.java b/qi4j/extensions/entitystore-s3/src/main/java/org/qi4j/entitystore/s3/S3EntityStoreService.java
new file mode 100644
index 0000000..37f925a
--- /dev/null
+++ b/qi4j/extensions/entitystore-s3/src/main/java/org/qi4j/entitystore/s3/S3EntityStoreService.java
@@ -0,0 +1,33 @@
+/* Copyright 2008 Rickard Öberg.
+ *
+ * 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.qi4j.entitystore.s3;
+
+import org.qi4j.api.mixin.Mixins;
+import org.qi4j.api.service.ServiceActivation;
+import org.qi4j.library.locking.LockingAbstractComposite;
+import org.qi4j.spi.entitystore.EntityStore;
+
+/**
+ * EntityStore service backed by Amazon S3 store.
+ */
+
+@Mixins( { S3SerializationStoreMixin.class } )
+public interface S3EntityStoreService
+ extends EntityStore, ServiceActivation, LockingAbstractComposite
+
+{
+}
\ No newline at end of file