http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/beans/src/test/java/org/qi4j/library/beans/properties/PropertiesMixinTest.java ---------------------------------------------------------------------- diff --git a/qi4j/libraries/beans/src/test/java/org/qi4j/library/beans/properties/PropertiesMixinTest.java b/qi4j/libraries/beans/src/test/java/org/qi4j/library/beans/properties/PropertiesMixinTest.java new file mode 100644 index 0000000..8ca4dee --- /dev/null +++ b/qi4j/libraries/beans/src/test/java/org/qi4j/library/beans/properties/PropertiesMixinTest.java @@ -0,0 +1,229 @@ +/* + * Copyright 2007 Alin Dreghiciu. All Rights Reserved. + * + * 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.library.beans.properties; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; +import org.qi4j.api.composite.TransientBuilder; +import org.qi4j.api.composite.TransientComposite; +import org.qi4j.api.mixin.Mixins; +import org.qi4j.bootstrap.AssemblyException; +import org.qi4j.bootstrap.ModuleAssembly; +import org.qi4j.test.AbstractQi4jTest; + +import java.util.Iterator; + +public class PropertiesMixinTest extends AbstractQi4jTest +{ + private SampleJavaBean m_proxy; + + public void assemble( ModuleAssembly aModule ) throws AssemblyException + { + aModule.transients( SampleJavaBeanComposite.class ); + } + + @Override + @Before + public void setUp() throws Exception + { + super.setUp(); + TransientBuilder<SampleJavaBeanComposite> builder = module.newTransientBuilder( SampleJavaBeanComposite.class ); + m_proxy = builder.newInstance(); + } + + @Test + public void setAndGetFoo() + { + m_proxy.setFoo( "aValue" ); + assertEquals( "aValue", m_proxy.getFoo() ); + } + + @Test + public void setAndGet() + { + m_proxy.set( "aValue" ); + assertEquals( "aValue", m_proxy.get() ); + } + + @Test + public void getFooWithoutSetFoo() + { + assertEquals( null, m_proxy.getFoo() ); + } + + @Test + public void iterateBarAfterAddBar() + { + m_proxy.addBar( "aValue" ); + Iterator<String> iterator = m_proxy.barIterator(); + assertNotNull( "iterator should not be null", iterator ); + assertEquals( "iterator has a value", true, iterator.hasNext() ); + assertEquals( "iterator content", "aValue", iterator.next() ); + } + + @Test + public void iterateAfterAdd() + { + m_proxy.add( "aValue" ); + Iterator<String> iterator = m_proxy.iterator(); + assertNotNull( "iterator should not be null", iterator ); + assertEquals( "iterator has a value", true, iterator.hasNext() ); + assertEquals( "iterator content", "aValue", iterator.next() ); + } + + @Test + public void iterateBarAfterAddAndRemoveBar() + { + m_proxy.addBar( "aValue" ); + m_proxy.removeBar( "aValue" ); + Iterator<String> iterator = m_proxy.barIterator(); + assertNotNull( iterator ); + assertFalse( iterator.hasNext() ); + } + + @Test + public void iterateAfterAddAndRemove() + { + m_proxy.add( "aValue" ); + m_proxy.remove( "aValue" ); + Iterator<String> iterator = m_proxy.iterator(); + assertNotNull( iterator ); + assertFalse( iterator.hasNext() ); + } + + @Test + public void removeBarWithoutAddBar() + { + m_proxy.removeBar( "aValue" ); + } + + @Test + public void removeWithoutAdd() + { + m_proxy.remove( "aValue" ); + } + + @Test + public void iterateBarWithoutAddBar() + { + Iterator<String> iterator = m_proxy.barIterator(); + assertNotNull( "iterator not supposed to be null", iterator ); + assertFalse( iterator.hasNext() ); + } + + @Test + public void iterateWithoutAdd() + { + Iterator<String> iterator = m_proxy.barIterator(); + assertNotNull( "iterator not supposed to be null", iterator ); + assertFalse( iterator.hasNext() ); + } + + @Test + public void addFooAndGetFoo() + { + m_proxy.addFoo( "aValue" ); + assertNull( "getter supposed to be null", m_proxy.getFoo() ); + } + + @Test + public void addFooAndSetFoo() + { + m_proxy.addFoo( "addValue" ); + m_proxy.setFoo( "setValue" ); + } + + @Test + public void setFooAndAddFoo() + { + m_proxy.setFoo( "setValue" ); + m_proxy.addFoo( "addValue" ); + } + + @Test + public void setFooAndRemoveFoo() + { + m_proxy.setFoo( "aValue" ); + m_proxy.removeFoo( "aValue" ); + assertEquals( "aValue", m_proxy.getFoo() ); + } + + @Test + public void setFooAndIterateFoo() + { + m_proxy.setFoo( "aValue" ); + Iterator<String> iterator = m_proxy.fooIterator(); + assertNotNull( "iterator not supposed to be null", iterator ); + assertFalse( iterator.hasNext() ); + } + + @Test + public void setValidAndIsValid() + { + m_proxy.setValid( true ); + assertTrue( m_proxy.isValid() ); + } + + @Test + public void setTestedAndHasTested() + { + m_proxy.setTested( true ); + assertTrue( m_proxy.hasTested() ); + } + + @Mixins( PropertiesMixin.class ) + public static interface SampleJavaBeanComposite extends SampleJavaBean, TransientComposite + { + } + + public static interface SampleJavaBean + { + public String getFoo(); + + public void setFoo( String value ); + + public String get(); + + public void set( String value ); + + public void addFoo( String value ); + + public void removeFoo( String value ); + + public Iterator<String> fooIterator(); + + public void addBar( String value ); + + public void removeBar( String value ); + + public Iterator<String> barIterator(); + + public void add( String value ); + + public void remove( String value ); + + public Iterator<String> iterator(); + + public boolean isValid(); + + public void setValid( boolean value ); + + public boolean hasTested(); + + public void setTested( boolean value ); + } + +}
http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/beans/src/test/java/org/qi4j/library/beans/support/JavabeanBackedTest.java ---------------------------------------------------------------------- diff --git a/qi4j/libraries/beans/src/test/java/org/qi4j/library/beans/support/JavabeanBackedTest.java b/qi4j/libraries/beans/src/test/java/org/qi4j/library/beans/support/JavabeanBackedTest.java new file mode 100644 index 0000000..e1ed9a8 --- /dev/null +++ b/qi4j/libraries/beans/src/test/java/org/qi4j/library/beans/support/JavabeanBackedTest.java @@ -0,0 +1,214 @@ +/* + * Copyright 2008 Niclas Hedhman. All rights Reserved. + * + * 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.library.beans.support; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import org.junit.Test; +import org.junit.Ignore; +import org.qi4j.api.common.Optional; +import org.qi4j.api.composite.TransientComposite; +import org.qi4j.api.composite.TransientBuilder; +import org.qi4j.api.association.Association; +import org.qi4j.api.association.ManyAssociation; +import org.qi4j.api.property.Property; +import org.qi4j.bootstrap.AssemblyException; +import org.qi4j.bootstrap.ModuleAssembly; +import org.qi4j.test.AbstractQi4jTest; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class JavabeanBackedTest extends AbstractQi4jTest +{ + + public void assemble( ModuleAssembly module ) throws AssemblyException + { + module.transients( PersonComposite.class, CountryComposite.class, CityComposite.class ); + } + + @Test + @Ignore + public void givenPersonPojoWhenDataIsOkThenExpectCorrectResult() + throws Exception + { + CountryPojo malaysia = new CountryPojo( "Malaysia" ); + Set<CityPojo> cities = new HashSet<CityPojo>(); + CityPojo kl = new CityPojo( "Kuala Lumpur", malaysia ); + cities.add( kl ); + CityPojo jb = new CityPojo( "Johor Bahru", malaysia ); + cities.add( jb ); + CityPojo penang = new CityPojo( "Penang", malaysia ); + cities.add( penang ); + CityPojo kk = new CityPojo( "Kota Kinabalu", malaysia ); + cities.add( kk ); + malaysia.setCities( cities ); + + List<PersonPojo> friendsNiclas = new ArrayList<PersonPojo>(); + List<PersonPojo> friendsMakas = new ArrayList<PersonPojo>(); + List<PersonPojo> friendsEdward = new ArrayList<PersonPojo>(); + PersonPojo niclasPojo = new PersonPojo( "Niclas Hedhman", kl, friendsNiclas ); + PersonPojo makasPojo = new PersonPojo( "Makas Lau", kl, friendsMakas ); + PersonPojo edwardPojo = new PersonPojo( "Edward Yakop", kl, friendsEdward ); + friendsEdward.add( makasPojo ); + friendsEdward.add( niclasPojo ); + friendsMakas.add( edwardPojo ); + friendsMakas.add( niclasPojo ); + friendsNiclas.add( makasPojo ); + friendsNiclas.add( edwardPojo ); + + TransientBuilder<Person> builder = module.newTransientBuilder( Person.class ); + builder.use( niclasPojo ); + Person niclas = builder.newInstance(); + Property<String> stringProperty = niclas.name(); + assertEquals( "Name match.", "Niclas Hedhman", stringProperty.get() ); + Property<City> cityProperty = niclas.city(); + City cityValue = cityProperty.get(); + Association<Country> countryAssociation = cityValue.country(); + Country country = countryAssociation.get(); + assertEquals( "Country match.", "Malaysia", country.name().get() ); + ManyAssociation citylist = country.cities(); + for( Object aCitylist : citylist ) + { + City city = (City) aCitylist; + String name = city.name().get(); + assertTrue( name.equals( "Kuala Lumpur" ) || + name.equals( "Johor Bahru" ) || + name.equals( "Kota Kinabalu" ) || + name.equals( "Penang" ) + ); + } + assertEquals( 4, country.cities().count() ); + } + + + public interface PersonComposite extends Person, JavabeanSupport, TransientComposite + { + } + + public interface Person + { + @Optional Property<String> name(); + + @Optional Property<City> city(); + + ManyAssociation<Person> friends(); + } + + public interface CityComposite extends City, JavabeanSupport, TransientComposite + { + } + + public interface CountryComposite extends Country, JavabeanSupport, TransientComposite + { + } + + public interface City + { + @Optional Property<String> name(); + + @Optional Association<Country> country(); + } + + public interface Country + { + @Optional Property<String> name(); + + ManyAssociation<City> cities(); + } + + public class PersonPojo + { + private String name; + private CityPojo city; + private List<PersonPojo> friends; + + public PersonPojo( String name, CityPojo city, List<PersonPojo> friends ) + { + this.name = name; + this.city = city; + this.friends = friends; + } + + public String getName() + { + return name; + } + + public CityPojo getCity() + { + return city; + } + + public List<PersonPojo> getFriends() + { + return friends; + } + } + + public class CountryPojo + { + private String countryName; + private Set<CityPojo> cities; + + public CountryPojo( String countryName ) + { + this.countryName = countryName; + } + + public String getName() + { + return countryName; + } + + public Set<CityPojo> getCities() + { + return cities; + } + + public void setCities( Set<CityPojo> cities ) + { + this.cities = cities; + } + } + + public class CityPojo + { + private final String name; + private final CountryPojo country; + + public CityPojo( String name, CountryPojo country ) + { + this.name = name; + this.country = country; + } + + public String getName() + { + return name; + } + + public CountryPojo getCountry() + { + return country; + } + } +} http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/entityproxy/pom.xml ---------------------------------------------------------------------- diff --git a/qi4j/libraries/entityproxy/pom.xml b/qi4j/libraries/entityproxy/pom.xml new file mode 100644 index 0000000..e046310 --- /dev/null +++ b/qi4j/libraries/entityproxy/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-libraries</artifactId> + <version>0-SNAPSHOT</version> + </parent> + <groupId>org.qi4j.sandbox</groupId> + <artifactId>org.qi4j.library.entityproxy</artifactId> + <name>Qi4j Library - Entityproxy</name> + <description>This library provides easy way to wrap your entities with transient composites so that qi4j-agnostic code may handle them without worrying about unit of work.</description> + <dependencies> + <dependency> + <groupId>org.qi4j.core</groupId> + <artifactId>org.qi4j.core.api</artifactId> + </dependency> + <dependency> + <groupId>org.qi4j.library</groupId> + <artifactId>org.qi4j.library.constraints</artifactId> + <version>${version.qi4j}</version> + </dependency> + <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> + + <build> + <plugins> + <plugin> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <source>1.6</source> + <target>1.6</target> + </configuration> + </plugin> + </plugins> + </build> +</project> http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/EntityProxy.java ---------------------------------------------------------------------- diff --git a/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/EntityProxy.java b/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/EntityProxy.java new file mode 100644 index 0000000..f212b63 --- /dev/null +++ b/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/EntityProxy.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2010, Stanislav Muhametsin. All Rights Reserved. + * + * 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.library.entityproxy; + +import org.qi4j.api.concern.Concerns; +import org.qi4j.api.injection.scope.Structure; +import org.qi4j.api.injection.scope.This; +import org.qi4j.api.mixin.Mixins; +import org.qi4j.api.property.Immutable; +import org.qi4j.api.property.Property; +import org.qi4j.api.unitofwork.UnitOfWorkFactory; +import org.qi4j.api.unitofwork.concern.UnitOfWorkConcern; +import org.qi4j.api.unitofwork.concern.UnitOfWorkPropagation; +import org.qi4j.api.unitofwork.concern.UnitOfWorkPropagation.Propagation; + +@Mixins({ + EntityProxy.EntityProxyMixin.class +}) +@Concerns({ + UnitOfWorkConcern.class +}) +public interface EntityProxy +{ + + String getEntityID(); + + Class<?> getCommonClass(); + + <EntityType> EntityType getEntity( Class<EntityType> entityClass ); + + public interface EntityProxyState + { + @Immutable + Property<String> entityID(); + + @Immutable + Property<Class<?>> commonClass(); + } + + public abstract class EntityProxyMixin + implements EntityProxy + { + + @This + private EntityProxyState _state; + + @This + private EntityProxy _meAsProxy; + + @Structure private UnitOfWorkFactory _uowf; + + @Override + public String getEntityID() + { + return this._state.entityID().get(); + } + + @Override + public Class<?> getCommonClass() + { + return this._state.commonClass().get(); + } + + @Override + @UnitOfWorkPropagation(Propagation.REQUIRED) + public <EntityType> EntityType getEntity( Class<EntityType> entityClass ) + { + return this._uowf.currentUnitOfWork().get( entityClass, this._meAsProxy.getEntityID() ); + } + + } +} http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/EntityProxyHelper.java ---------------------------------------------------------------------- diff --git a/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/EntityProxyHelper.java b/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/EntityProxyHelper.java new file mode 100644 index 0000000..5376bee --- /dev/null +++ b/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/EntityProxyHelper.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2010, Stanislav Muhametsin. All Rights Reserved. + * + * 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.library.entityproxy; + +import org.qi4j.api.concern.Concerns; +import org.qi4j.api.injection.scope.Structure; +import org.qi4j.api.mixin.Mixins; +import org.qi4j.api.service.ServiceComposite; +import org.qi4j.api.unitofwork.UnitOfWorkFactory; +import org.qi4j.api.unitofwork.concern.UnitOfWorkConcern; +import org.qi4j.api.unitofwork.concern.UnitOfWorkPropagation; +import org.qi4j.api.unitofwork.concern.UnitOfWorkPropagation.Propagation; + +/** + * + * @author Stanislav Muhametsin + */ +public interface EntityProxyHelper +{ + + public <EType, ReturnType> ReturnType getEntity( Class<ReturnType> entityClass, EType proxyOrEntity ); + + public <PType, ReturnType> ReturnType getProxy( Class<ReturnType> proxyClass, PType proxyOrEntity ); + + @Mixins({EntityProxyHelperMixin.class}) + @Concerns({UnitOfWorkConcern.class}) + public interface EntityProxyHelperService extends EntityProxyHelper, ServiceComposite + { + + } + + public abstract class EntityProxyHelperMixin + implements EntityProxyHelper + { + @Structure private UnitOfWorkFactory _uowf; + + + @Override + @UnitOfWorkPropagation(Propagation.REQUIRED) + public <EType, ReturnType> ReturnType getEntity( Class<ReturnType> entityClass, EType proxyOrEntity ) + { + return proxyOrEntity instanceof EntityProxy ? ((EntityProxy) proxyOrEntity).getEntity( entityClass ) + : entityClass.cast( this._uowf.currentUnitOfWork().get( proxyOrEntity )); + } + + @Override + @UnitOfWorkPropagation(Propagation.REQUIRED) + public <PType, ReturnType> ReturnType getProxy( Class<ReturnType> proxyClass, PType proxyOrEntity ) + { + return proxyOrEntity instanceof ProxyableEntity ? ((ProxyableEntity) this._uowf.currentUnitOfWork().get( proxyOrEntity )).getProxy( proxyClass ) + : proxyClass.cast( proxyOrEntity ); + } + } +} http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/MutualType.java ---------------------------------------------------------------------- diff --git a/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/MutualType.java b/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/MutualType.java new file mode 100644 index 0000000..d00a7b7 --- /dev/null +++ b/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/MutualType.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2010, Stanislav Muhametsin. All Rights Reserved. + * + * 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.library.entityproxy; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE}) +@Documented +public @interface MutualType +{ +} http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/NoCommonClassFoundException.java ---------------------------------------------------------------------- diff --git a/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/NoCommonClassFoundException.java b/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/NoCommonClassFoundException.java new file mode 100644 index 0000000..32bd185 --- /dev/null +++ b/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/NoCommonClassFoundException.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2010, Stanislav Muhametsin. All Rights Reserved. + * + * 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.library.entityproxy; + +public class NoCommonClassFoundException extends RuntimeException +{ + public NoCommonClassFoundException(String message) + { + super(message); + } + + public NoCommonClassFoundException(String message, Throwable cause) + { + super(message, cause); + } +} http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/ProxyableEntity.java ---------------------------------------------------------------------- diff --git a/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/ProxyableEntity.java b/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/ProxyableEntity.java new file mode 100644 index 0000000..38ce038 --- /dev/null +++ b/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/ProxyableEntity.java @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2010, Stanislav Muhametsin. All Rights Reserved. + * + * 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.library.entityproxy; + +import org.qi4j.api.composite.TransientBuilder; +import org.qi4j.api.composite.TransientBuilderFactory; +import org.qi4j.api.entity.EntityComposite; +import org.qi4j.api.entity.Lifecycle; +import org.qi4j.api.entity.LifecycleException; +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.mixin.Mixins; +import org.qi4j.api.unitofwork.UnitOfWorkCallback; +import org.qi4j.api.unitofwork.UnitOfWorkCompletionException; +import org.qi4j.api.unitofwork.UnitOfWorkFactory; +import org.qi4j.library.entityproxy.internal.EntityProxyCache; + +@Mixins({ProxyableEntity.ProxyableEntityMixin.class}) +public interface ProxyableEntity +{ + <ProxyType> ProxyType getProxy(Class<ProxyType> proxyClass); + + public abstract class ProxyableEntityMixin + implements ProxyableEntity, Lifecycle +{ + + @Service + private EntityProxyCache _proxyUtils; + + @Structure + private UnitOfWorkFactory _uowf; + + @This + private EntityComposite _meAsEntityComposite; + + @Structure private TransientBuilderFactory _tbf; + + @Override + public <ProxyType> ProxyType getProxy( Class<ProxyType> proxyClass ) + { + String id = this._meAsEntityComposite.identity().get(); + EntityProxy proxy = this._proxyUtils.getFromCache( id ); + if (proxy == null) + { + proxy = this.createProxy( proxyClass ); + this._proxyUtils.storeToCache( proxy ); + } + ProxyType result = proxyClass.cast( proxy ); + return result; + } + + private <ProxyType> EntityProxy createProxy(Class<ProxyType> proxyClass) + { + TransientBuilder<ProxyType> builder = this._tbf.newTransientBuilder(proxyClass); + EntityProxy.EntityProxyState state = builder.prototypeFor(EntityProxy.EntityProxyState.class); + Class<?> commonClass = this.doGetCommonType(proxyClass); + if (commonClass == null) + { + throw new NoCommonClassFoundException("Did not find common class for entity of type: " + this._meAsEntityComposite.getClass().getName() + " [proxyClass: " + proxyClass.getName() + "]."); + } + state.commonClass().set(commonClass); + state.entityID().set(this._meAsEntityComposite.identity().get()); + + return EntityProxy.class.cast( builder.newInstance() ); + } + + private Class<?> doGetCommonType(Class<?> clazz) + { + Class<?> result = null; + MutualType commonType = clazz.getAnnotation(MutualType.class); + if (commonType == null) + { + for (Class<?> sInterface : clazz.getInterfaces()) + { + result = this.doGetCommonType(sInterface); + if (result != null) + { + break; + } + } + + if (result == null && clazz.getSuperclass() != null) + { + result = this.doGetCommonType(clazz.getSuperclass()); + } + } + else + { + result = clazz; + } + + return result; + } + + @Override + public void create() + throws LifecycleException + { + + } + + @Override + public void remove() + throws LifecycleException + { + + final String id = this._meAsEntityComposite.identity().get(); + this._uowf.currentUnitOfWork().addUnitOfWorkCallback( new UnitOfWorkCallback() + { + + @Override + public void beforeCompletion() + throws UnitOfWorkCompletionException + { + // Nothing. + } + + @Override + public void afterCompletion( UnitOfWorkStatus status ) + { + if( status == UnitOfWorkStatus.COMPLETED ) + { + _proxyUtils.removeFromCache( id ); + } + } + } ); + + } +} +} http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/assembling/EntityProxyAssembler.java ---------------------------------------------------------------------- diff --git a/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/assembling/EntityProxyAssembler.java b/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/assembling/EntityProxyAssembler.java new file mode 100644 index 0000000..8681ff5 --- /dev/null +++ b/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/assembling/EntityProxyAssembler.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2010, Stanislav Muhametsin. All Rights Reserved. + * + * 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.library.entityproxy.assembling; + +import org.qi4j.api.common.Visibility; +import org.qi4j.bootstrap.Assembler; +import org.qi4j.bootstrap.AssemblyException; +import org.qi4j.bootstrap.ModuleAssembly; +import org.qi4j.library.entityproxy.EntityProxyHelper.EntityProxyHelperService; +import org.qi4j.library.entityproxy.internal.EntityProxyCacheService; + +/** + * + * @author Stanislav Muhametsin + */ +public class EntityProxyAssembler implements Assembler +{ + + public EntityProxyAssembler() + { + + } + + @Override + public void assemble( ModuleAssembly module ) + throws AssemblyException + { + module.addServices( EntityProxyCacheService.class, EntityProxyHelperService.class).visibleIn( Visibility.application ); + } +} http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/internal/EntityProxyCache.java ---------------------------------------------------------------------- diff --git a/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/internal/EntityProxyCache.java b/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/internal/EntityProxyCache.java new file mode 100644 index 0000000..c2e84a7 --- /dev/null +++ b/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/internal/EntityProxyCache.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2010, Stanislav Muhametsin. All Rights Reserved. + * + * 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.library.entityproxy.internal; + +import java.util.LinkedHashMap; +import java.util.Map; + +import org.qi4j.api.service.ServiceActivation; +import org.qi4j.library.constraints.annotation.GreaterThan; +import org.qi4j.library.entityproxy.EntityProxy; + +public interface EntityProxyCache extends ServiceActivation +{ + public EntityProxy getFromCache(String entityID); + + public void storeToCache(EntityProxy proxy); + + public void removeFromCache(String entityID); + + public Integer getMaxCacheSize(); + + public Integer getCurrentCacheSize(); + + public void setMaxCacheSize(@GreaterThan(0) Integer newSize); + + public abstract class EntityProxyUtilsMixin implements EntityProxyCache + { + + private static final Integer DEFAULT_MAX_PROXIES = 1000; + + private Map<String, EntityProxy> _entityProxyMapping; + + private Integer _maxProxies; + + @Override + public void activateService() throws Exception + { + this._maxProxies = DEFAULT_MAX_PROXIES; + this._entityProxyMapping = new LinkedHashMap<String, EntityProxy>(this._maxProxies); + } + + @Override + public void passivateService() throws Exception + { + } + + @Override + public Integer getCurrentCacheSize() + { + return this._entityProxyMapping.size(); + } + + @Override + public EntityProxy getFromCache( String entityID ) + { + return this._entityProxyMapping.get( entityID ); + } + @Override + public Integer getMaxCacheSize() + { + return this._maxProxies; + } + + @Override + public void removeFromCache( String entityID ) + { + this._entityProxyMapping.remove( entityID ); + } + + @Override + public void setMaxCacheSize( Integer newSize ) + { + this._maxProxies = newSize; + while (this._entityProxyMapping.size() > this._maxProxies) + { + this.removeEldestProxy(); + } + } + + @Override + public void storeToCache( EntityProxy proxy ) + { + synchronized( this._entityProxyMapping ) + { + if (this._entityProxyMapping.size() == this._maxProxies) + { + this.removeEldestProxy(); + } + this._entityProxyMapping.put( proxy.getEntityID(), proxy ); + } + } + + private void removeEldestProxy() + { + this._entityProxyMapping.remove( this._entityProxyMapping.keySet().iterator().next() ); + } + } +} http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/internal/EntityProxyCacheService.java ---------------------------------------------------------------------- diff --git a/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/internal/EntityProxyCacheService.java b/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/internal/EntityProxyCacheService.java new file mode 100644 index 0000000..cd2ab00 --- /dev/null +++ b/qi4j/libraries/entityproxy/src/main/java/org/qi4j/library/entityproxy/internal/EntityProxyCacheService.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2010, Stanislav Muhametsin. All Rights Reserved. + * + * 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.library.entityproxy.internal; + +import org.qi4j.api.concern.Concerns; +import org.qi4j.api.mixin.Mixins; +import org.qi4j.api.service.ServiceComposite; +import org.qi4j.api.unitofwork.concern.UnitOfWorkConcern; + +@Mixins({ + EntityProxyCache.EntityProxyUtilsMixin.class + }) +@Concerns({ + UnitOfWorkConcern.class + }) +public interface EntityProxyCacheService extends EntityProxyCache, ServiceComposite +{ + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/entityproxy/src/test/java/org/qi4j/library/entityproxy/EntityProxyTest.java ---------------------------------------------------------------------- diff --git a/qi4j/libraries/entityproxy/src/test/java/org/qi4j/library/entityproxy/EntityProxyTest.java b/qi4j/libraries/entityproxy/src/test/java/org/qi4j/library/entityproxy/EntityProxyTest.java new file mode 100644 index 0000000..2563be2 --- /dev/null +++ b/qi4j/libraries/entityproxy/src/test/java/org/qi4j/library/entityproxy/EntityProxyTest.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2010, Stanislav Muhametsin. All Rights Reserved. + * + * 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.library.entityproxy; + +import junit.framework.Assert; + +import org.junit.Test; +import org.qi4j.api.unitofwork.ConcurrentEntityModificationException; +import org.qi4j.api.unitofwork.UnitOfWork; +import org.qi4j.api.unitofwork.UnitOfWorkCompletionException; +import org.qi4j.bootstrap.AssemblyException; +import org.qi4j.bootstrap.ModuleAssembly; +import org.qi4j.library.entityproxy.EntityWithMutualType.EntityCompositeWithMutualType; +import org.qi4j.library.entityproxy.EntityWithMutualType.EntityProxyWithMutualType; +import org.qi4j.library.entityproxy.MissingMutualTypeEntity.MissingMutualTypeEntityComposite; +import org.qi4j.library.entityproxy.MissingMutualTypeEntity.MissingMutualTypeEntityProxy; +import org.qi4j.library.entityproxy.assembling.EntityProxyAssembler; +import org.qi4j.test.AbstractQi4jTest; +import org.qi4j.test.EntityTestAssembler; + +/** + * + * @author Stanislav Muhametsin + */ +public class EntityProxyTest extends AbstractQi4jTest +{ + + @Override + public void assemble( ModuleAssembly module ) + throws AssemblyException + { + module.entities( EntityCompositeWithMutualType.class, MissingMutualTypeEntityComposite.class ); + module.transients( EntityProxyWithMutualType.class, MissingMutualTypeEntityProxy.class ); + + EntityProxyAssembler eAss = new EntityProxyAssembler(); + eAss.assemble( module ); + + new EntityTestAssembler().assemble( module ); + } + + private <EntityType> EntityType createEntity(Class<EntityType> entityClass) throws ConcurrentEntityModificationException, UnitOfWorkCompletionException + { + UnitOfWork uow = module.newUnitOfWork(); + EntityType result = uow.newEntity( entityClass ); + uow.complete(); + return result; + } + + @Test + public void getEntityProxyTest() throws Exception + { + EntityWithMutualType entity = this.createEntity( EntityCompositeWithMutualType.class ); + + UnitOfWork uow = module.newUnitOfWork(); + EntityWithMutualType proxy = ((ProxyableEntity)uow.get( entity )).getProxy( EntityWithMutualType.class ); + uow.complete(); + + Assert.assertNotNull( "The proxy must be non-null.", proxy ); + } + + @Test + public void getProxyableEntity() throws Exception + { + EntityWithMutualType entity = this.createEntity( EntityCompositeWithMutualType.class ); + + UnitOfWork uow = module.newUnitOfWork(); + EntityWithMutualType proxy = ((ProxyableEntity)uow.get( entity )).getProxy( EntityWithMutualType.class ); + uow.complete(); + + entity = ((EntityProxy)proxy).getEntity( EntityWithMutualType.class ); + + uow = module.newUnitOfWork(); + try + { + Assert.assertNotNull( "The proxy must point to existing entity.", uow.get(entity) ); + } finally + { + uow.discard(); + } + } + + @Test(expected = NoCommonClassFoundException.class) + public void testMissingMutualType() throws Exception + { + MissingMutualTypeEntity entity = this.createEntity( MissingMutualTypeEntity.class ); + + UnitOfWork uow = module.newUnitOfWork(); + try + { + MissingMutualTypeEntity proxy = ((ProxyableEntity)uow.get( entity )).getProxy( MissingMutualTypeEntity.class ); + } finally + { + uow.complete(); + } + } + + @Test + public void changesMustPropagateToEntityTest() throws Exception + { + EntityWithMutualType entity = this.createEntity( EntityCompositeWithMutualType.class ); + + UnitOfWork uow = module.newUnitOfWork(); + EntityWithMutualType proxy = ((ProxyableEntity)uow.get( entity )).getProxy( EntityWithMutualType.class ); + uow.complete(); + + proxy.setMyString( "TestString" ); + + uow = module.newUnitOfWork(); + try + { + Assert.assertEquals( "The change must go down to entity.", "TestString", uow.get( entity ).getMyString() ); + } finally + { + uow.discard(); + } + } +} http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/entityproxy/src/test/java/org/qi4j/library/entityproxy/EntityWithMutualType.java ---------------------------------------------------------------------- diff --git a/qi4j/libraries/entityproxy/src/test/java/org/qi4j/library/entityproxy/EntityWithMutualType.java b/qi4j/libraries/entityproxy/src/test/java/org/qi4j/library/entityproxy/EntityWithMutualType.java new file mode 100644 index 0000000..3d6be5b --- /dev/null +++ b/qi4j/libraries/entityproxy/src/test/java/org/qi4j/library/entityproxy/EntityWithMutualType.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2010, Stanislav Muhametsin. All Rights Reserved. + * + * 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.library.entityproxy; + +import org.qi4j.api.composite.TransientComposite; +import org.qi4j.api.entity.EntityComposite; +import org.qi4j.api.mixin.Mixins; + +/** + * + * @author Stanislav Muhametsin + */ +@MutualType +public interface EntityWithMutualType extends SomeRole +{ + + public interface EntityCompositeWithMutualType extends EntityWithMutualType, ProxyableEntity, EntityComposite + { + + } + + @Mixins({ SomeRole.SomeRoleProxyMixin.class }) + public interface EntityProxyWithMutualType extends EntityWithMutualType, EntityProxy, TransientComposite + { + + } + +} http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/entityproxy/src/test/java/org/qi4j/library/entityproxy/MissingMutualTypeEntity.java ---------------------------------------------------------------------- diff --git a/qi4j/libraries/entityproxy/src/test/java/org/qi4j/library/entityproxy/MissingMutualTypeEntity.java b/qi4j/libraries/entityproxy/src/test/java/org/qi4j/library/entityproxy/MissingMutualTypeEntity.java new file mode 100644 index 0000000..3bb3f9a --- /dev/null +++ b/qi4j/libraries/entityproxy/src/test/java/org/qi4j/library/entityproxy/MissingMutualTypeEntity.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2010, Stanislav Muhametsin. All Rights Reserved. + * + * 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.library.entityproxy; + +import org.qi4j.api.composite.TransientComposite; +import org.qi4j.api.entity.EntityComposite; +import org.qi4j.api.mixin.Mixins; + +/** + * + * @author Stanislav Muhametsin + */ +public interface MissingMutualTypeEntity extends SomeRole +{ + + public interface MissingMutualTypeEntityComposite extends MissingMutualTypeEntity, ProxyableEntity, EntityComposite + { + + } + + @Mixins({ SomeRole.SomeRoleProxyMixin.class }) + public interface MissingMutualTypeEntityProxy extends MissingMutualTypeEntity, EntityProxy, TransientComposite + { + + } +} http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/entityproxy/src/test/java/org/qi4j/library/entityproxy/SomeRole.java ---------------------------------------------------------------------- diff --git a/qi4j/libraries/entityproxy/src/test/java/org/qi4j/library/entityproxy/SomeRole.java b/qi4j/libraries/entityproxy/src/test/java/org/qi4j/library/entityproxy/SomeRole.java new file mode 100644 index 0000000..8c1e18b --- /dev/null +++ b/qi4j/libraries/entityproxy/src/test/java/org/qi4j/library/entityproxy/SomeRole.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2010, Stanislav Muhametsin. All Rights Reserved. + * + * 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.library.entityproxy; + +import org.qi4j.api.common.Optional; +import org.qi4j.api.injection.scope.This; +import org.qi4j.api.mixin.Mixins; +import org.qi4j.api.property.Property; +import org.qi4j.api.unitofwork.concern.UnitOfWorkPropagation; +import org.qi4j.api.unitofwork.concern.UnitOfWorkPropagation.Propagation; + +/** + * + * @author Stanislav Muhametsin + */ +@Mixins({ + SomeRole.SomeRoleMixin.class +}) +public interface SomeRole +{ + + public String getMyString(); + + public void setMyString(String str); + + public interface SomeRoleState + { + @Optional + Property<String> myString(); + } + + public class SomeRoleMixin implements SomeRole + { + + @This private SomeRoleState _state; + + @Override + public String getMyString() + { + return this._state.myString().get(); + } + + @Override + public void setMyString( String str ) + { + this._state.myString().set( str ); + } + + } + + // The reason why proxy mixins are not generic is that sometimes, for example, entity may return the value of @This-injected variable, + // which is not instance of ProxyableEntity, but still an entity. Then a full control is needed. + public class SomeRoleProxyMixin implements SomeRole + { + @This private EntityProxy _proxy; + + @Override + @UnitOfWorkPropagation(Propagation.REQUIRED) + public String getMyString() + { + return this._proxy.getEntity( SomeRole.class ).getMyString(); + } + + @Override + @UnitOfWorkPropagation(Propagation.REQUIRED) + public void setMyString( String str ) + { + this._proxy.getEntity( SomeRole.class ).setMyString( str ); + } + } +} http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/dev-status.xml ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/dev-status.xml b/qi4j/libraries/exception/dev-status.xml new file mode 100644 index 0000000..1e523b4 --- /dev/null +++ b/qi4j/libraries/exception/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>none</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/libraries/exception/licenses/.svn/all-wcprops ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/licenses/.svn/all-wcprops b/qi4j/libraries/exception/licenses/.svn/all-wcprops new file mode 100644 index 0000000..34b9b1c --- /dev/null +++ b/qi4j/libraries/exception/licenses/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 70 +/repos/ops4j/!svn/ver/12441/projects/qi4j/libraries/exception/licenses +END http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/licenses/.svn/entries ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/licenses/.svn/entries b/qi4j/libraries/exception/licenses/.svn/entries new file mode 100644 index 0000000..21f4838 --- /dev/null +++ b/qi4j/libraries/exception/licenses/.svn/entries @@ -0,0 +1,28 @@ +8 + +dir +14719 +https://scm.ops4j.org/repos/ops4j/projects/qi4j/libraries/exception/licenses +https://scm.ops4j.org/repos/ops4j + + + +2008-07-26T12:42:38.335187Z +12441 [email protected] + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +9b982a3c-3ae5-0310-a4bc-d9a3335569bd + http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/licenses/.svn/format ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/licenses/.svn/format b/qi4j/libraries/exception/licenses/.svn/format new file mode 100644 index 0000000..45a4fb7 --- /dev/null +++ b/qi4j/libraries/exception/licenses/.svn/format @@ -0,0 +1 @@ +8 http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/pom.xml ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/pom.xml b/qi4j/libraries/exception/pom.xml new file mode 100644 index 0000000..14c30db --- /dev/null +++ b/qi4j/libraries/exception/pom.xml @@ -0,0 +1,37 @@ +<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-libraries</artifactId> + <version>0-SNAPSHOT</version> + </parent> + <groupId>org.qi4j.library</groupId> + <artifactId>org.qi4j.library.exception</artifactId> + <name>Qi4j Library - Exception Handling</name> + + <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.core</groupId> + <artifactId>org.qi4j.core.testsupport</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + </dependencies> +</project> http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/.svn/all-wcprops ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/.svn/all-wcprops b/qi4j/libraries/exception/src/.svn/all-wcprops new file mode 100644 index 0000000..292a7a7 --- /dev/null +++ b/qi4j/libraries/exception/src/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 65 +/repos/ops4j/!svn/ver/13742/projects/qi4j/libraries/exception/src +END http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/.svn/entries ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/.svn/entries b/qi4j/libraries/exception/src/.svn/entries new file mode 100644 index 0000000..bd80ce2 --- /dev/null +++ b/qi4j/libraries/exception/src/.svn/entries @@ -0,0 +1,34 @@ +8 + +dir +14719 +https://scm.ops4j.org/repos/ops4j/projects/qi4j/libraries/exception/src +https://scm.ops4j.org/repos/ops4j + + + +2008-12-16T11:13:26.017490Z +13742 [email protected] + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +9b982a3c-3ae5-0310-a4bc-d9a3335569bd + +test +dir + +main +dir + http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/.svn/format ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/.svn/format b/qi4j/libraries/exception/src/.svn/format new file mode 100644 index 0000000..45a4fb7 --- /dev/null +++ b/qi4j/libraries/exception/src/.svn/format @@ -0,0 +1 @@ +8 http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/.svn/all-wcprops ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/.svn/all-wcprops b/qi4j/libraries/exception/src/main/.svn/all-wcprops new file mode 100644 index 0000000..b2f265e --- /dev/null +++ b/qi4j/libraries/exception/src/main/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 70 +/repos/ops4j/!svn/ver/13742/projects/qi4j/libraries/exception/src/main +END http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/.svn/entries ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/.svn/entries b/qi4j/libraries/exception/src/main/.svn/entries new file mode 100644 index 0000000..3597cb3 --- /dev/null +++ b/qi4j/libraries/exception/src/main/.svn/entries @@ -0,0 +1,31 @@ +8 + +dir +14719 +https://scm.ops4j.org/repos/ops4j/projects/qi4j/libraries/exception/src/main +https://scm.ops4j.org/repos/ops4j + + + +2008-12-16T11:13:26.017490Z +13742 [email protected] + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +9b982a3c-3ae5-0310-a4bc-d9a3335569bd + +java +dir + http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/.svn/format ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/.svn/format b/qi4j/libraries/exception/src/main/.svn/format new file mode 100644 index 0000000..45a4fb7 --- /dev/null +++ b/qi4j/libraries/exception/src/main/.svn/format @@ -0,0 +1 @@ +8 http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/.svn/all-wcprops ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/.svn/all-wcprops b/qi4j/libraries/exception/src/main/java/.svn/all-wcprops new file mode 100644 index 0000000..0046ee9 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 75 +/repos/ops4j/!svn/ver/13742/projects/qi4j/libraries/exception/src/main/java +END http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/.svn/entries ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/.svn/entries b/qi4j/libraries/exception/src/main/java/.svn/entries new file mode 100644 index 0000000..3099041 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/.svn/entries @@ -0,0 +1,31 @@ +8 + +dir +14719 +https://scm.ops4j.org/repos/ops4j/projects/qi4j/libraries/exception/src/main/java +https://scm.ops4j.org/repos/ops4j + + + +2008-12-16T11:13:26.017490Z +13742 [email protected] + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +9b982a3c-3ae5-0310-a4bc-d9a3335569bd + +org +dir + http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/.svn/format ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/.svn/format b/qi4j/libraries/exception/src/main/java/.svn/format new file mode 100644 index 0000000..45a4fb7 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/.svn/format @@ -0,0 +1 @@ +8 http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/.svn/all-wcprops ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/.svn/all-wcprops b/qi4j/libraries/exception/src/main/java/org/.svn/all-wcprops new file mode 100644 index 0000000..b966086 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 79 +/repos/ops4j/!svn/ver/13742/projects/qi4j/libraries/exception/src/main/java/org +END http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/.svn/entries ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/.svn/entries b/qi4j/libraries/exception/src/main/java/org/.svn/entries new file mode 100644 index 0000000..5c5182b --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/.svn/entries @@ -0,0 +1,31 @@ +8 + +dir +14719 +https://scm.ops4j.org/repos/ops4j/projects/qi4j/libraries/exception/src/main/java/org +https://scm.ops4j.org/repos/ops4j + + + +2008-12-16T11:13:26.017490Z +13742 [email protected] + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +9b982a3c-3ae5-0310-a4bc-d9a3335569bd + +qi4j +dir + http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/.svn/format ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/.svn/format b/qi4j/libraries/exception/src/main/java/org/.svn/format new file mode 100644 index 0000000..45a4fb7 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/.svn/format @@ -0,0 +1 @@ +8 http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/.svn/all-wcprops ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/.svn/all-wcprops b/qi4j/libraries/exception/src/main/java/org/qi4j/.svn/all-wcprops new file mode 100644 index 0000000..e4b389d --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 84 +/repos/ops4j/!svn/ver/13742/projects/qi4j/libraries/exception/src/main/java/org/qi4j +END http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/.svn/entries ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/.svn/entries b/qi4j/libraries/exception/src/main/java/org/qi4j/.svn/entries new file mode 100644 index 0000000..af9b8aa --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/.svn/entries @@ -0,0 +1,31 @@ +8 + +dir +14719 +https://scm.ops4j.org/repos/ops4j/projects/qi4j/libraries/exception/src/main/java/org/qi4j +https://scm.ops4j.org/repos/ops4j + + + +2008-12-16T11:13:26.017490Z +13742 [email protected] + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +9b982a3c-3ae5-0310-a4bc-d9a3335569bd + +library +dir + http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/.svn/format ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/.svn/format b/qi4j/libraries/exception/src/main/java/org/qi4j/.svn/format new file mode 100644 index 0000000..45a4fb7 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/.svn/format @@ -0,0 +1 @@ +8 http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/library/.svn/all-wcprops ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/library/.svn/all-wcprops b/qi4j/libraries/exception/src/main/java/org/qi4j/library/.svn/all-wcprops new file mode 100644 index 0000000..a29b0c2 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/library/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 92 +/repos/ops4j/!svn/ver/13742/projects/qi4j/libraries/exception/src/main/java/org/qi4j/library +END http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/library/.svn/entries ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/library/.svn/entries b/qi4j/libraries/exception/src/main/java/org/qi4j/library/.svn/entries new file mode 100644 index 0000000..5cf1ff0 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/library/.svn/entries @@ -0,0 +1,31 @@ +8 + +dir +14719 +https://scm.ops4j.org/repos/ops4j/projects/qi4j/libraries/exception/src/main/java/org/qi4j/library +https://scm.ops4j.org/repos/ops4j + + + +2008-12-16T11:13:26.017490Z +13742 [email protected] + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +9b982a3c-3ae5-0310-a4bc-d9a3335569bd + +exception +dir + http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/library/.svn/format ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/library/.svn/format b/qi4j/libraries/exception/src/main/java/org/qi4j/library/.svn/format new file mode 100644 index 0000000..45a4fb7 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/library/.svn/format @@ -0,0 +1 @@ +8 http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/all-wcprops ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/all-wcprops b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/all-wcprops new file mode 100644 index 0000000..accc3af --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/all-wcprops @@ -0,0 +1,65 @@ +K 25 +svn:wc:ra_dav:version-url +V 102 +/repos/ops4j/!svn/ver/13742/projects/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception +END +ExceptionHandlingNotificationConcern.java +K 25 +svn:wc:ra_dav:version-url +V 144 +/repos/ops4j/!svn/ver/13742/projects/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/ExceptionHandlingNotificationConcern.java +END +ExceptionHandling.java +K 25 +svn:wc:ra_dav:version-url +V 125 +/repos/ops4j/!svn/ver/12464/projects/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/ExceptionHandling.java +END +ExceptionObservable.java +K 25 +svn:wc:ra_dav:version-url +V 127 +/repos/ops4j/!svn/ver/12464/projects/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/ExceptionObservable.java +END +ExceptionObserver.java +K 25 +svn:wc:ra_dav:version-url +V 125 +/repos/ops4j/!svn/ver/12464/projects/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/ExceptionObserver.java +END +SystemErrExceptionHandlingMixin.java +K 25 +svn:wc:ra_dav:version-url +V 139 +/repos/ops4j/!svn/ver/12464/projects/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/SystemErrExceptionHandlingMixin.java +END +ExceptionObservableMixin.java +K 25 +svn:wc:ra_dav:version-url +V 132 +/repos/ops4j/!svn/ver/13742/projects/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/ExceptionObservableMixin.java +END +ObservableExceptionHandlingService.java +K 25 +svn:wc:ra_dav:version-url +V 142 +/repos/ops4j/!svn/ver/13742/projects/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/ObservableExceptionHandlingService.java +END +DelegatingExceptionObserver.java +K 25 +svn:wc:ra_dav:version-url +V 135 +/repos/ops4j/!svn/ver/12464/projects/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/DelegatingExceptionObserver.java +END +NullExceptionHandling.java +K 25 +svn:wc:ra_dav:version-url +V 129 +/repos/ops4j/!svn/ver/12464/projects/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/NullExceptionHandling.java +END +SimpleExceptionHandlingService.java +K 25 +svn:wc:ra_dav:version-url +V 138 +/repos/ops4j/!svn/ver/13742/projects/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/SimpleExceptionHandlingService.java +END http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/entries ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/entries b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/entries new file mode 100644 index 0000000..0b0f918 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/entries @@ -0,0 +1,158 @@ +8 + +dir +14719 +https://scm.ops4j.org/repos/ops4j/projects/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception +https://scm.ops4j.org/repos/ops4j + + + +2008-12-16T11:13:26.017490Z +13742 [email protected] + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +9b982a3c-3ae5-0310-a4bc-d9a3335569bd + +ExceptionHandlingNotificationConcern.java +file + + + + +2009-04-05T04:16:42.000000Z +73ff824c08ee67ed5f1ba4a3d3850d29 +2008-12-16T11:13:26.017490Z +13742 [email protected] +has-props + +ExceptionHandling.java +file + + + + +2009-04-05T04:16:42.000000Z +763b3886feab2bd18cf7baae5806d466 +2008-07-30T03:59:42.341738Z +12464 [email protected] +has-props + +ExceptionObservable.java +file + + + + +2009-04-05T04:16:42.000000Z +b1c2bf9efeba4f6be16d052cfa9d577a +2008-07-30T03:59:42.341738Z +12464 [email protected] +has-props + +ExceptionObserver.java +file + + + + +2009-04-05T04:16:42.000000Z +ace5fa42fc4f338d1a5c506cb8459e32 +2008-07-30T03:59:42.341738Z +12464 [email protected] +has-props + +SystemErrExceptionHandlingMixin.java +file + + + + +2009-04-05T04:16:42.000000Z +b5584d5522869f417f76f2f151a3e234 +2008-07-30T03:59:42.341738Z +12464 [email protected] +has-props + +ExceptionObservableMixin.java +file + + + + +2009-04-05T04:16:42.000000Z +092661c2003fdd452b397d20514dd5fd +2008-12-16T11:13:26.017490Z +13742 [email protected] +has-props + +ObservableExceptionHandlingService.java +file + + + + +2009-04-05T04:16:42.000000Z +672d78d16ff53bf03b05638ab48ca377 +2008-12-16T11:13:26.017490Z +13742 [email protected] +has-props + +DelegatingExceptionObserver.java +file + + + + +2009-04-05T04:16:42.000000Z +eae1c8abb25bab16da660f6cef9afdeb +2008-07-30T03:59:42.341738Z +12464 [email protected] +has-props + +NullExceptionHandling.java +file + + + + +2009-04-05T04:16:42.000000Z +122ff5432a8e2b5d607160747dc193eb +2008-07-30T03:59:42.341738Z +12464 [email protected] +has-props + +SimpleExceptionHandlingService.java +file + + + + +2009-04-05T04:16:42.000000Z +98d295d244112f3da0bf768fe6f7be96 +2008-12-16T11:13:26.017490Z +13742 [email protected] +has-props + http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/format ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/format b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/format new file mode 100644 index 0000000..45a4fb7 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/format @@ -0,0 +1 @@ +8 http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/DelegatingExceptionObserver.java.svn-base ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/DelegatingExceptionObserver.java.svn-base b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/DelegatingExceptionObserver.java.svn-base new file mode 100644 index 0000000..bdbd305 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/DelegatingExceptionObserver.java.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:eol-style +V 6 +native +END http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ExceptionHandling.java.svn-base ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ExceptionHandling.java.svn-base b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ExceptionHandling.java.svn-base new file mode 100644 index 0000000..bdbd305 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ExceptionHandling.java.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:eol-style +V 6 +native +END http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ExceptionHandlingNotificationConcern.java.svn-base ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ExceptionHandlingNotificationConcern.java.svn-base b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ExceptionHandlingNotificationConcern.java.svn-base new file mode 100644 index 0000000..bdbd305 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ExceptionHandlingNotificationConcern.java.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:eol-style +V 6 +native +END http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ExceptionObservable.java.svn-base ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ExceptionObservable.java.svn-base b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ExceptionObservable.java.svn-base new file mode 100644 index 0000000..bdbd305 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ExceptionObservable.java.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:eol-style +V 6 +native +END http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ExceptionObservableMixin.java.svn-base ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ExceptionObservableMixin.java.svn-base b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ExceptionObservableMixin.java.svn-base new file mode 100644 index 0000000..bdbd305 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ExceptionObservableMixin.java.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:eol-style +V 6 +native +END http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ExceptionObserver.java.svn-base ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ExceptionObserver.java.svn-base b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ExceptionObserver.java.svn-base new file mode 100644 index 0000000..bdbd305 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ExceptionObserver.java.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:eol-style +V 6 +native +END http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/NullExceptionHandling.java.svn-base ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/NullExceptionHandling.java.svn-base b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/NullExceptionHandling.java.svn-base new file mode 100644 index 0000000..bdbd305 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/NullExceptionHandling.java.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:eol-style +V 6 +native +END http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ObservableExceptionHandlingService.java.svn-base ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ObservableExceptionHandlingService.java.svn-base b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ObservableExceptionHandlingService.java.svn-base new file mode 100644 index 0000000..bdbd305 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/ObservableExceptionHandlingService.java.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:eol-style +V 6 +native +END http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/SimpleExceptionHandlingService.java.svn-base ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/SimpleExceptionHandlingService.java.svn-base b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/SimpleExceptionHandlingService.java.svn-base new file mode 100644 index 0000000..bdbd305 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/SimpleExceptionHandlingService.java.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:eol-style +V 6 +native +END http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/SystemErrExceptionHandlingMixin.java.svn-base ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/SystemErrExceptionHandlingMixin.java.svn-base b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/SystemErrExceptionHandlingMixin.java.svn-base new file mode 100644 index 0000000..bdbd305 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/prop-base/SystemErrExceptionHandlingMixin.java.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:eol-style +V 6 +native +END http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/text-base/DelegatingExceptionObserver.java.svn-base ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/text-base/DelegatingExceptionObserver.java.svn-base b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/text-base/DelegatingExceptionObserver.java.svn-base new file mode 100644 index 0000000..903b5d6 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/text-base/DelegatingExceptionObserver.java.svn-base @@ -0,0 +1,85 @@ +/* + * Copyright 2008 Niclas Hedhman. All rights Reserved. + * + * 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.library.exception; + +import java.util.Iterator; +import java.util.LinkedList; + +public class DelegatingExceptionObserver + implements ExceptionObserver +{ + private LinkedList<ExceptionObserver> observers; + + public DelegatingExceptionObserver( ExceptionObserver existing ) + { + observers = new LinkedList<ExceptionObserver>(); + observers.add( existing ); + } + + public void notify( String message, Object source, Throwable exception ) + { + Iterator<ExceptionObserver> iterator; + synchronized( this ) + { + iterator = observers.iterator(); + } + while( iterator.hasNext() ) + { + ExceptionObserver observer = iterator.next(); + try + { + observer.notify( message, source, exception ); + } + catch( Throwable e ) + { + System.err.println( "WARNING: ExceptionObserver " + observer + " threw an exception. See below." ); + e.printStackTrace( System.err ); + } + } + } + + void addExceptionObserver( ExceptionObserver observer ) + { + synchronized( this ) + { + LinkedList<ExceptionObserver> clone = new LinkedList<ExceptionObserver>(); + clone.addAll( observers ); + clone.add( observer ); + observers = clone; + } + } + + ExceptionObserver removeExceptionObserver( ExceptionObserver observer ) + { + synchronized( this ) + { + LinkedList<ExceptionObserver> clone = new LinkedList<ExceptionObserver>(); + clone.addAll( observers ); + clone.remove( observer ); + if( observers.size() == 1 ) + { + ExceptionObserver last = observers.removeFirst(); + observers = null; + return last; + } + observers = clone; + return this; + } + } + +} http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/text-base/ExceptionHandling.java.svn-base ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/text-base/ExceptionHandling.java.svn-base b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/text-base/ExceptionHandling.java.svn-base new file mode 100644 index 0000000..016e8cd --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/text-base/ExceptionHandling.java.svn-base @@ -0,0 +1,23 @@ +/* + * Copyright 2008 Niclas Hedhman. All rights Reserved. + * + * 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.library.exception; + +public interface ExceptionHandling +{ + void exceptionOccurred( String message, Object location, Throwable exception ); +} http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/text-base/ExceptionHandlingNotificationConcern.java.svn-base ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/text-base/ExceptionHandlingNotificationConcern.java.svn-base b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/text-base/ExceptionHandlingNotificationConcern.java.svn-base new file mode 100644 index 0000000..428d6fa --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/text-base/ExceptionHandlingNotificationConcern.java.svn-base @@ -0,0 +1,41 @@ +/* + * Copyright 2008 Niclas Hedhman. All rights Reserved. + * + * 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.library.exception; + +import org.qi4j.api.injection.scope.This; +import org.qi4j.api.property.Property; +import org.qi4j.api.concern.ConcernOf; +import org.qi4j.api.mixin.Mixins; + +@Mixins( ExceptionObservableMixin.class ) +public class ExceptionHandlingNotificationConcern extends ConcernOf<ExceptionHandling> + implements ExceptionHandling +{ + @This private Property<ExceptionObserver> observer; + + public void exceptionOccurred( String message, Object location, Throwable exception ) + { + ExceptionObserver current; + synchronized( this ) + { + current = observer.get(); + } + current.notify( message, location, exception ); + next.exceptionOccurred( message, location, exception ); + } +} http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/text-base/ExceptionObservable.java.svn-base ---------------------------------------------------------------------- diff --git a/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/text-base/ExceptionObservable.java.svn-base b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/text-base/ExceptionObservable.java.svn-base new file mode 100644 index 0000000..7009895 --- /dev/null +++ b/qi4j/libraries/exception/src/main/java/org/qi4j/library/exception/.svn/text-base/ExceptionObservable.java.svn-base @@ -0,0 +1,25 @@ +/* + * Copyright 2008 Niclas Hedhman. All rights Reserved. + * + * 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.library.exception; + +public interface ExceptionObservable +{ + void addExceptionObserver( ExceptionObserver observer ); + + void removeExceptionObserver( ExceptionObserver observer ); +}
