Return-Path:
X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io
Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io
Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183])
by cust-asf2.ponee.io (Postfix) with ESMTP id C70A4200CC1
for ; Mon, 10 Jul 2017 08:53:10 +0200 (CEST)
Received: by cust-asf.ponee.io (Postfix)
id C5A59167263; Mon, 10 Jul 2017 06:53:10 +0000 (UTC)
Delivered-To: archive-asf-public@cust-asf.ponee.io
Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
by cust-asf.ponee.io (Postfix) with SMTP id 5B48E167181
for ; Mon, 10 Jul 2017 08:53:08 +0200 (CEST)
Received: (qmail 82435 invoked by uid 500); 10 Jul 2017 06:53:07 -0000
Mailing-List: contact commits-help@polygene.apache.org; run by ezmlm
Precedence: bulk
List-Help:
List-Unsubscribe:
List-Post:
List-Id:
Reply-To: dev@polygene.apache.org
Delivered-To: mailing list commits@polygene.apache.org
Received: (qmail 81744 invoked by uid 99); 10 Jul 2017 06:53:05 -0000
Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23)
by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 10 Jul 2017 06:53:05 +0000
Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33)
id 0F4A7F552C; Mon, 10 Jul 2017 06:53:04 +0000 (UTC)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
From: niclas@apache.org
To: commits@polygene.apache.org
Date: Mon, 10 Jul 2017 06:53:18 -0000
Message-Id: <79a7651ee62343fe9a7b43ebf379f044@git.apache.org>
In-Reply-To:
References:
X-Mailer: ASF-Git Admin Mailer
Subject: [16/50] polygene-java git commit: POLYGENE-265 - method argument
names are now used in Constraint Violations. POLYGENE-264 - Consolidated how
the ConstraintViolationException works. POLYGENE-262 -
NoSuchCompositeException and subtypes changed name to NoS
archived-at: Mon, 10 Jul 2017 06:53:10 -0000
POLYGENE-265 - method argument names are now used in Constraint Violations.
POLYGENE-264 - Consolidated how the ConstraintViolationException works.
POLYGENE-262 - NoSuchCompositeException and subtypes changed name to NoSuchCompositeTypeException.
Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/559b38a5
Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/559b38a5
Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/559b38a5
Branch: refs/heads/es-jooq
Commit: 559b38a5b0c857c6553ae9dff925ff71a65f1cae
Parents: 85a37fd
Author: niclas
Authored: Mon Jun 19 15:43:59 2017 +0800
Committer: niclas
Committed: Mon Jun 19 15:43:59 2017 +0800
----------------------------------------------------------------------
.../api/composite/NoSuchCompositeException.java | 56 ----
.../composite/NoSuchCompositeTypeException.java | 138 ++++++++
.../api/composite/NoSuchTransientException.java | 45 ---
.../composite/NoSuchTransientTypeException.java | 42 +++
.../api/composite/TransientBuilderFactory.java | 8 +-
.../api/constraint/ConstraintViolation.java | 56 ----
.../ConstraintViolationException.java | 312 +++++++++++--------
.../constraint/ValueConstraintViolation.java | 79 +++++
.../api/object/NoSuchObjectException.java | 57 ----
.../api/object/NoSuchObjectTypeException.java | 57 ++++
.../polygene/api/object/ObjectFactory.java | 4 +-
.../api/service/NoSuchServiceException.java | 58 ----
.../api/service/NoSuchServiceTypeException.java | 47 +++
.../polygene/api/service/ServiceFinder.java | 8 +-
.../unitofwork/NoSuchEntityTypeException.java | 21 +-
.../polygene/api/unitofwork/UnitOfWork.java | 2 -
.../api/value/NoSuchValueException.java | 46 ---
.../api/value/NoSuchValueTypeException.java | 45 +++
.../polygene/api/value/ValueBuilderFactory.java | 14 +-
.../bootstrap/AssemblyReportException.java | 5 +-
.../association/AbstractAssociationModel.java | 10 +-
.../bootstrap/CompositeAssemblyImpl.java | 117 ++++---
.../runtime/bootstrap/ModuleAssemblyImpl.java | 2 +-
.../runtime/composite/CompositeModel.java | 11 +-
.../runtime/composite/ConstraintsInstance.java | 24 +-
.../composite/FragmentInvocationHandler.java | 15 +-
.../composite/ValueConstraintsInstance.java | 33 +-
.../composite/ValueConstraintsModel.java | 14 +-
.../polygene/runtime/entity/EntityInstance.java | 13 +-
.../ServiceInjectionProviderFactory.java | 4 +-
.../provider/UsesInjectionProviderFactory.java | 8 +-
.../runtime/property/PropertyModel.java | 9 +-
.../runtime/query/QueryBuilderFactoryImpl.java | 4 +-
.../runtime/structure/ModuleInstance.java | 46 +--
.../runtime/value/ValueBuilderInstance.java | 4 +-
.../polygene/runtime/value/ValueModel.java | 114 ++++++-
.../constraints/PropertyConstraintTest.java | 4 +-
.../composite/CompositeFactoryImplTest.java | 4 +-
.../composite/InterfaceDefaultMethodsTest.java | 7 +-
.../runtime/constraints/ConstraintsTest.java | 6 +-
.../objects/ObjectBuilderFactoryTest.java | 4 +-
.../runtime/objects/ObjectVisibilityTest.java | 62 ++--
.../runtime/service/ServiceVisibilityTest.java | 62 ++--
.../runtime/structure/MixinVisibilityTest.java | 4 +-
.../PrivateCompositeVisibilityTest.java | 4 +-
.../transients/TransientBuilderFactoryTest.java | 4 +-
.../transients/TransientVisibilityTest.java | 62 ++--
.../runtime/value/ValueVisibilityTest.java | 62 ++--
.../test/cache/AbstractCachePoolTest.java | 11 +-
.../test/entity/model/EntityStoreTestSuite.java | 153 +++++++--
.../test/entity/model/legal/LegalService.java | 68 +++-
.../polygene/test/entity/model/legal/Will.java | 14 +-
.../test/entity/model/legal/WillAmount.java | 3 +-
.../test/entity/model/legal/WillBenefit.java | 1 +
.../test/entity/model/monetary/Currency.java | 51 +++
.../polygene/test/entity/model/people/Rent.java | 20 +-
.../polygene/test/cache/MemoryCacheTest.java | 3 +-
.../apache/polygene/test/docker/DockerRule.java | 2 +-
.../library/constraints/ConstraintTest.java | 3 +-
.../rest/server/api/ContextResource.java | 4 +-
.../restlet/ConstraintViolationMessages.java | 4 +-
.../restlet/InteractionConstraintsService.java | 6 +-
.../ParameterViolationConcern.java | 4 +-
.../PhoneNumberParameterViolationConcern.java | 6 +-
64 files changed, 1294 insertions(+), 872 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/api/src/main/java/org/apache/polygene/api/composite/NoSuchCompositeException.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/composite/NoSuchCompositeException.java b/core/api/src/main/java/org/apache/polygene/api/composite/NoSuchCompositeException.java
deleted file mode 100644
index c3f51bb..0000000
--- a/core/api/src/main/java/org/apache/polygene/api/composite/NoSuchCompositeException.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *
- */
-package org.apache.polygene.api.composite;
-
-import org.apache.polygene.api.common.InvalidApplicationException;
-
-/**
- * This exception is thrown if client code tries to create a non-existing Composite type.
- */
-public class NoSuchCompositeException extends InvalidApplicationException
-{
- private final String compositeType;
- private final String moduleName;
- private final String visibleTypes;
-
- protected NoSuchCompositeException( String metaType, String compositeType, String moduleName, String visibleTypes )
- {
- super( "Could not find any visible " + metaType + " of type [" + compositeType + "] in module [" +
- moduleName + "].\n" + visibleTypes );
- this.compositeType = compositeType;
- this.moduleName = moduleName;
- this.visibleTypes = visibleTypes;
- }
-
- public String compositeType()
- {
- return compositeType;
- }
-
- public String moduleName()
- {
- return moduleName;
- }
-
- public String visibleTypes()
- {
- return visibleTypes;
- }
-}
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/api/src/main/java/org/apache/polygene/api/composite/NoSuchCompositeTypeException.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/composite/NoSuchCompositeTypeException.java b/core/api/src/main/java/org/apache/polygene/api/composite/NoSuchCompositeTypeException.java
new file mode 100644
index 0000000..64977ef
--- /dev/null
+++ b/core/api/src/main/java/org/apache/polygene/api/composite/NoSuchCompositeTypeException.java
@@ -0,0 +1,138 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+package org.apache.polygene.api.composite;
+
+import java.util.stream.Stream;
+import org.apache.polygene.api.common.InvalidApplicationException;
+import org.apache.polygene.api.structure.TypeLookup;
+
+import static java.util.stream.Collectors.joining;
+
+/**
+ * This exception is thrown if client code tries to create a non-existing Composite type.
+ */
+public abstract class NoSuchCompositeTypeException extends InvalidApplicationException
+{
+ private final String compositeType;
+ private final String moduleName;
+ private final String visibleTypes;
+ private final String metaType;
+ private final String candidateTypes;
+
+ protected NoSuchCompositeTypeException( String metaType, String compositeType, String moduleName, TypeLookup typeLookup )
+ {
+ super( "\n\tCould not find any visible " + metaType + " of type [" + compositeType + "] in module [" + moduleName + "]." );
+ this.metaType = metaType;
+ this.compositeType = compositeType;
+ this.moduleName = moduleName;
+ visibleTypes = formatVisibleTypes( typeLookup );
+ candidateTypes = findCandidateTypes( typeLookup );
+ }
+
+ public String compositeType()
+ {
+ return compositeType;
+ }
+
+ public String moduleName()
+ {
+ return moduleName;
+ }
+
+ public String visibleTypes()
+ {
+ return visibleTypes;
+ }
+
+ public String candidateTypes()
+ {
+ return candidateTypes;
+ }
+
+ @Override
+ public String getMessage()
+ {
+ return super.getMessage() + "\n" + candidateTypes + "\n" + visibleTypes;
+ }
+
+ private String formatVisibleTypes( TypeLookup typeLookup )
+ {
+ return descriptors( typeLookup )
+ .map( descriptor ->
+ {
+ String moduleName = descriptor.module().name();
+ String typeName = descriptor.primaryType().getName();
+ return "\t\t[" + typeName + "] in [" + moduleName + "]";
+ } )
+ .sorted()
+ .distinct()
+ .collect( joining( "\n", "\tVisible " + metaType + " types are:\n", "" ) );
+ }
+
+ private String findCandidateTypes( TypeLookup typeLookup )
+ {
+ return "";
+// return descriptors( typeLookup )
+// .filter( type -> compositeType.equals( type.primaryType().getName() ) )
+// .map( descriptor ->
+// {
+// Class> primarytype = descriptor.primaryType();
+// String typeName = primarytype.getName();
+// return "\t\t[ " + typeName + "] in [" + descriptor.module().name() + "] with visibility " + descriptor.visibility();
+// } )
+// .collect( joining( "\n", "\tInvisible " + metaType + " types are:\n", "" ) );
+ }
+
+ protected abstract Stream extends CompositeDescriptor> descriptors( TypeLookup typeLookup );
+
+ @Override
+ public boolean equals( Object o )
+ {
+ if( this == o )
+ {
+ return true;
+ }
+ if( o == null || getClass() != o.getClass() )
+ {
+ return false;
+ }
+
+ NoSuchCompositeTypeException that = (NoSuchCompositeTypeException) o;
+
+ if( !compositeType.equals( that.compositeType ) )
+ {
+ return false;
+ }
+ if( !moduleName.equals( that.moduleName ) )
+ {
+ return false;
+ }
+ return visibleTypes.equals( that.visibleTypes );
+ }
+
+ @Override
+ public int hashCode()
+ {
+ int result = compositeType.hashCode();
+ result = 31 * result + moduleName.hashCode();
+ result = 31 * result + visibleTypes.hashCode();
+ return result;
+ }
+}
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/api/src/main/java/org/apache/polygene/api/composite/NoSuchTransientException.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/composite/NoSuchTransientException.java b/core/api/src/main/java/org/apache/polygene/api/composite/NoSuchTransientException.java
deleted file mode 100644
index d55c34d..0000000
--- a/core/api/src/main/java/org/apache/polygene/api/composite/NoSuchTransientException.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *
- */
-
-package org.apache.polygene.api.composite;
-
-import org.apache.polygene.api.structure.TypeLookup;
-
-import static java.util.stream.Collectors.joining;
-
-/**
- * This exception is thrown if client code tries to create a non-existing TransientComposite type.
- */
-public class NoSuchTransientException extends NoSuchCompositeException
-{
- public NoSuchTransientException( String typeName, String moduleName, TypeLookup typeLookup )
- {
- super( "TransientComposite", typeName, moduleName, formatVisibleTypes( typeLookup ) );
- }
-
- private static String formatVisibleTypes( TypeLookup typeLookup )
- {
- return typeLookup.allTransients()
- .map( descriptor -> descriptor.primaryType().getName() )
- .sorted()
- .distinct()
- .collect( joining( "\n", "Visible transient types are:\n", "" ) );
- }
-}
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/api/src/main/java/org/apache/polygene/api/composite/NoSuchTransientTypeException.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/composite/NoSuchTransientTypeException.java b/core/api/src/main/java/org/apache/polygene/api/composite/NoSuchTransientTypeException.java
new file mode 100644
index 0000000..45ecd17
--- /dev/null
+++ b/core/api/src/main/java/org/apache/polygene/api/composite/NoSuchTransientTypeException.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+
+package org.apache.polygene.api.composite;
+
+import java.util.stream.Stream;
+import org.apache.polygene.api.structure.TypeLookup;
+
+import static java.util.stream.Collectors.joining;
+
+/**
+ * This exception is thrown if client code tries to create a non-existing TransientComposite type.
+ */
+public class NoSuchTransientTypeException extends NoSuchCompositeTypeException
+{
+ public NoSuchTransientTypeException( String typeName, String moduleName, TypeLookup typeLookup )
+ {
+ super( "TransientComposite", typeName, moduleName, typeLookup );
+ }
+
+ protected Stream extends CompositeDescriptor> descriptors( TypeLookup typeLookup )
+ {
+ return typeLookup.allTransients();
+ }
+}
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/api/src/main/java/org/apache/polygene/api/composite/TransientBuilderFactory.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/composite/TransientBuilderFactory.java b/core/api/src/main/java/org/apache/polygene/api/composite/TransientBuilderFactory.java
index 5656c71..12f71e9 100644
--- a/core/api/src/main/java/org/apache/polygene/api/composite/TransientBuilderFactory.java
+++ b/core/api/src/main/java/org/apache/polygene/api/composite/TransientBuilderFactory.java
@@ -39,10 +39,10 @@ public interface TransientBuilderFactory
*
* @return a TransientBuilder for creation of TransientComposites implementing the interface
*
- * @throws NoSuchTransientException if no composite extending the mixinType has been registered
+ * @throws NoSuchTransientTypeException if no composite extending the mixinType has been registered
*/
TransientBuilder newTransientBuilder( Class mixinType )
- throws NoSuchTransientException;
+ throws NoSuchTransientTypeException;
/**
* Instantiate a TransientComposite of the given type.
@@ -53,10 +53,10 @@ public interface TransientBuilderFactory
*
* @return a new TransientComposite instance
*
- * @throws NoSuchTransientException if no composite extending the mixinType has been registered
+ * @throws NoSuchTransientTypeException if no composite extending the mixinType has been registered
* @throws org.apache.polygene.api.common.ConstructionException
* if the composite could not be instantiated
*/
T newTransient( Class mixinType, Object... uses )
- throws NoSuchTransientException, ConstructionException;
+ throws NoSuchTransientTypeException, ConstructionException;
}
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/api/src/main/java/org/apache/polygene/api/constraint/ConstraintViolation.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/constraint/ConstraintViolation.java b/core/api/src/main/java/org/apache/polygene/api/constraint/ConstraintViolation.java
deleted file mode 100644
index 75bbecb..0000000
--- a/core/api/src/main/java/org/apache/polygene/api/constraint/ConstraintViolation.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *
- */
-
-package org.apache.polygene.api.constraint;
-
-import java.lang.annotation.Annotation;
-
-/**
- * When a constraint violation has occurred (ie Constraint.isValid has returned false) it
- * is put in a collection of all violations that have occurred for this value check.
- */
-public final class ConstraintViolation
-{
- private String name;
- private final Annotation constraint;
- private final Object value;
-
- public ConstraintViolation( String name, Annotation constraint, Object value )
- {
- this.name = name;
- this.constraint = constraint;
- this.value = value;
- }
-
- public String name()
- {
- return name;
- }
-
- public Annotation constraint()
- {
- return constraint;
- }
-
- public Object value()
- {
- return value;
- }
-}
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/api/src/main/java/org/apache/polygene/api/constraint/ConstraintViolationException.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/constraint/ConstraintViolationException.java b/core/api/src/main/java/org/apache/polygene/api/constraint/ConstraintViolationException.java
index a007a11..c54d35d 100644
--- a/core/api/src/main/java/org/apache/polygene/api/constraint/ConstraintViolationException.java
+++ b/core/api/src/main/java/org/apache/polygene/api/constraint/ConstraintViolationException.java
@@ -20,23 +20,22 @@
package org.apache.polygene.api.constraint;
import java.lang.annotation.Annotation;
-import java.lang.reflect.Member;
import java.lang.reflect.Type;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
-import java.util.MissingResourceException;
+import java.util.Objects;
import java.util.ResourceBundle;
import java.util.stream.Collectors;
import java.util.stream.Stream;
-import org.apache.polygene.api.composite.Composite;
+import org.apache.polygene.api.composite.CompositeDescriptor;
+import org.apache.polygene.api.entity.EntityDescriptor;
import org.apache.polygene.api.identity.Identity;
+import org.apache.polygene.api.service.ServiceDescriptor;
import org.apache.polygene.api.util.Classes;
-import static java.util.stream.Collectors.joining;
-
/**
* This Exception is thrown when there is one or more Constraint Violations in a method
* call.
@@ -48,65 +47,49 @@ import static java.util.stream.Collectors.joining;
*/
public class ConstraintViolationException extends IllegalArgumentException
{
- private final Collection constraintViolations;
- private String methodName;
- private String mixinTypeName;
- private String instanceToString;
- private List extends Type> instanceTypes;
+ private static final boolean longNames = Boolean.getBoolean( "polygene.constraints.longNames" );
+ private static final String DEFAULT_PATTERN = "\n\tConstraint Violation(s) in {0} of types [{3}].\n";
+ private static final String ENTITY_DEFAULT_PATTERN = "\n\tConstraint Violation(s) in entity {0} with id=[{2}].\n";
+ private static final String SERVICE_DEFAULT_PATTERN = "\n\tConstraint Violation(s) in service {0} with id=[{2}].\n";
+ private static final String MIXIN_DEFAULT_PATTERN = "\t\t@{2}({3}) on {0}.{1}(). Parameter [{4}] does not allow value [{5}].\n";
- public ConstraintViolationException( Composite instance, Member method,
- Collection constraintViolations
- )
- {
- this( instance.toString(), Classes.interfacesOf( instance.getClass() ), method, constraintViolations );
- }
-
- public ConstraintViolationException( String instanceToString,
- Stream extends Type> instanceTypes,
- Member method,
- Collection violations
- )
- {
- this.instanceToString = instanceToString;
- this.instanceTypes = instanceTypes.collect( Collectors.toList() );
- mixinTypeName = method.getDeclaringClass().getName();
- methodName = method.getName();
- this.constraintViolations = violations;
- }
+ private String instanceToString; // arg {0}
+ private Class> primaryType; // arg {1}
+ private List extends Type> instanceTypes; // arg {2}
+ private Collection constraintViolations; // arg {4} and {5}
+ private String identity; // arg {6}
+ private boolean isService;
+ private boolean isEntity;
- public ConstraintViolationException( Identity identity,
- List extends Type> instanceTypes,
- String mixinTypeName,
- String methodName,
- Collection violations
- )
+ public ConstraintViolationException( Collection violations )
{
- this.instanceToString = identity.toString();
- this.instanceTypes = instanceTypes;
- this.mixinTypeName = mixinTypeName;
- this.methodName = methodName;
- this.constraintViolations = violations;
+ this.constraintViolations = new ArrayList<>();
+ this.constraintViolations.addAll( violations );
}
- public Collection constraintViolations()
+ public Collection constraintViolations()
{
return constraintViolations;
}
/**
- * Creates localized messages of all the constraint violations that has occured.
+ * Creates localized message of all the constraint violations that has occured.
*
- * The key "polygene.constraint.CompositeType.methodName
"
- * will be used to lookup the text formatting
- * pattern from the ResourceBundle, where CompositeType
is the
- * class name of the Composite where the constraint was violated. If such key does not exist, then the
- * key "polygene.constraint
" will be used, and if that one also doesn't exist, or
- * the resourceBundle argument is null, then the default patterns will be used;
+ * Each ConstraintViolationException concerns one Composite instance, but may have many violations on that
+ * instance. For the composite instance related message following entries in the ResourceBundle will be searched
+ * for a pattern in the following order;
+ *
+ * polygene.constraint.CompositeType
+ * polygene.constraint.composite
+ *
+ * where CompositeType
is the
+ * class name of the Composite instance. If such key does not exist, or if the resourceBundle argument is null,
+ * then the default patterns will be used;
*
- *
+ *
* Type of Composite | Pattern used |
* Composite |
- * Constraint Violation in {2}.{3} with constraint {4}, in composite \n{0} of type {1} |
+ * \tConstraint Violation(s) in {0} with types {3}\n |
*
* EntityComposite |
* Constraint Violation in {2}.{3} with constraint {4}, in entity {1}[id={0}] |
@@ -115,144 +98,213 @@ public class ConstraintViolationException extends IllegalArgumentException
* Constraint Violation in {2}.{3} with constraint {4}, in service {0} |
*
*
+ * The ResourceBundle arguments are defined as;
+ *
+ *
* Then format each ConstraintViolation according to such pattern, where the following argument are passed;
*
Arg | Value |
*
* {0} |
+ * Primary Type of Composite |
+ *
+ *
+ * {1} |
* Composite instance toString() |
*
*
+ * {2} |
+ * Identity if composite implements HasIdentity |
+ *
+ *
+ * {3} |
+ * Comma-separeated list of types implemented by Composite |
+ *
+ *
+ *
+ * Once the message at the composite type level has been established, the message will contain each of the found
+ * violations. For each such violation, the resource bundle will be searched in the following order;
+ *
+ * polygene.constraint.MixinType.member
+ * polygene.constraint.MixinType
+ * polygene.constraint.mixin
+ *
+ * where MixinType
refers to the mixin type of the member (method, field or
+ * constructor) and the member
is the name of such Member.
+ *
+ * Type of Composite | Pattern used |
+ * Mixin |
+ * \t\t@{2} {0}.{1} does not allow value [{4}] |
+ *
+ *
+ * For these the ResourceBundle arguments are;
+ * Arg | Value |
+ *
+ * {0} |
+ * Mixin Type Name |
+ *
+ *
* {1} |
- * CompositeType class name |
+ * Mixin Member Name |
*
*
* {2} |
- * MixinType class name |
+ * Annotation type |
*
*
* {3} |
- * MixinType method name |
+ * Annotation toString |
*
*
* {4} |
- * Annotation toString() |
+ * Name of the Member, see {@link Name} |
*
*
* {5} |
- * toString() of value passed as the argument, or "null" text if argument was null. |
+ * Value attempted |
*
*
- *
- * NOTE!!! This class is still under construction and will be modified further.
- *
*
* @param bundle The ResourceBundle for Localization, or null if default formatting and locale to be used.
- *
* @return An array of localized messages of the violations incurred.
*/
- public String[] localizedMessagesFrom( ResourceBundle bundle )
+ public String localizedMessageFrom( ResourceBundle bundle )
{
- String pattern = "Constraint violation in {0}.{1} for method ''{3}'' with constraint \"{4}({6})\", for value ''{5}''";
-
- ArrayList list = new ArrayList<>();
- for( ConstraintViolation violation : constraintViolations )
+ Locale locale;
+ if( bundle != null )
{
- Locale locale;
- if( bundle != null )
+ locale = bundle.getLocale();
+ }
+ else
+ {
+ locale = Locale.getDefault();
+ }
+ StringBuffer message = new StringBuffer();
+ {
+ String[] searchKeys = new String[]{ "polygene.constraint." + primaryType, "polygene.constraint.composite" };
+ String compositePattern = findPattern( bundle, searchKeys, defaultPattern() );
+ String types = instanceTypes == null
+ ? null
+ : instanceTypes.stream()
+ .map( this::nameOf )
+ .collect( Collectors.joining( "," ) );
+ String name;
+ if( longNames )
{
- try
- {
- pattern = bundle.getString( "polygene.constraint." + mixinTypeName + "." + methodName );
- }
- catch( MissingResourceException e1 )
- {
- try
- {
- pattern = bundle.getString( "polygene.constraint" );
- }
- catch( MissingResourceException e2 )
- {
- // ignore. The default pattern will be used.
- }
- }
- locale = bundle.getLocale();
+ name = primaryType.getName();
}
else
{
- locale = Locale.getDefault();
+ name = primaryType.getSimpleName();
}
- MessageFormat format = new MessageFormat( pattern, locale );
+ Object[] args = new Object[]{ name, instanceToString, identity, types };
+ MessageFormat formatter = new MessageFormat( compositePattern, locale );
+ formatter.format( args, message, null );
+ }
+ for( ValueConstraintViolation violation : constraintViolations )
+ {
+ String[] searchKeys = new String[]{ "polygene.constraint." + primaryType, "polygene.constraint.composite" };
+ String mixinPattern = findPattern( bundle, searchKeys, MIXIN_DEFAULT_PATTERN );
Annotation annotation = violation.constraint();
- String name = violation.name();
- Object value = violation.value();
- String classes;
- if( instanceTypes.size() == 1 )
- {
- Type type = instanceTypes.stream().findFirst().get();
- classes = Classes.RAW_CLASS.apply( type ).getSimpleName();
- }
- else
- {
- classes = "[" + instanceTypes.stream()
- .map( Classes.RAW_CLASS )
- .map( Class::getSimpleName ).collect( joining( "," ) ) + "]";
- }
+ Class extends Annotation> annotatioType = annotation.annotationType();
+ Class> mixinType = violation.mixinType();
Object[] args = new Object[]
{
- instanceToString,
- classes,
- mixinTypeName,
- methodName,
+ longNames ? mixinType.getName() : mixinType.getSimpleName(),
+ violation.methodName(),
+ longNames ? annotatioType.getName() : annotatioType.getSimpleName(),
annotation.toString(),
- "" + value,
- name
+ violation.name(),
+ violation.value()
};
- StringBuffer text = new StringBuffer();
- format.format( args, text, null );
- list.add( text.toString() );
+ MessageFormat formatter = new MessageFormat( mixinPattern, locale );
+ formatter.format( args, message, null );
}
- String[] result = new String[ list.size() ];
- list.toArray( result );
+ String result = message.toString();
+ message.setLength( 0 ); // TODO: is this still needed to avoid JVM memory leak??
return result;
}
- public String localizedMessage()
+ private String nameOf( Type type )
{
- String[] messages = localizedMessagesFrom( null );
- StringBuilder result = new StringBuilder();
- boolean first = true;
- for( String message : messages )
+ Class> clazz = Classes.RAW_CLASS.apply( type );
+ if( longNames )
{
- if( !first )
- {
- result.append( ',' );
- }
- first = false;
- result.append( message );
+ return clazz.getName();
+ }
+ else
+ {
+ return clazz.getSimpleName();
}
- return result.toString();
}
@Override
- public String getLocalizedMessage()
+ public String getMessage()
{
- return localizedMessage();
+ return localizedMessageFrom( null );
}
- @Override
- public String getMessage()
+ private String findPattern( ResourceBundle bundle, String[] searchKeys, String defaultPattern )
+ {
+ String compositePattern;
+ if( bundle != null )
+ {
+ compositePattern = Stream.of( searchKeys )
+ .map( name -> findPattern( bundle, name ) )
+ .filter( Objects::nonNull )
+ .findFirst().orElse( defaultPattern );
+ }
+ else
+ {
+ compositePattern = defaultPattern;
+ }
+ return compositePattern;
+ }
+
+ private String findPattern( ResourceBundle bundle, String name )
+ {
+ try
+ {
+ return bundle.getString( name );
+ }
+ catch( Exception e )
+ {
+ return null;
+ }
+ }
+
+ private String defaultPattern()
{
- return localizedMessage();
+ if( isEntity )
+ {
+ return ENTITY_DEFAULT_PATTERN;
+ }
+ if( isService )
+ {
+ return SERVICE_DEFAULT_PATTERN;
+ }
+ return DEFAULT_PATTERN;
}
- public String methodName()
+ public void setCompositeDescriptor( CompositeDescriptor descriptor )
{
- return methodName;
+ this.primaryType = descriptor.primaryType();
+ this.instanceTypes = descriptor.mixinTypes().collect( Collectors.toList() );
+ this.isEntity = descriptor instanceof EntityDescriptor;
+ this.isService = descriptor instanceof ServiceDescriptor;
+ }
+
+ public void setIdentity( Identity identity )
+ {
+ if( identity == null )
+ {
+ return;
+ }
+ this.identity = identity.toString();
}
- public String mixinTypeName()
+ public void setInstanceString( String instanceString )
{
- return mixinTypeName;
+ instanceToString = instanceString;
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/api/src/main/java/org/apache/polygene/api/constraint/ValueConstraintViolation.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/constraint/ValueConstraintViolation.java b/core/api/src/main/java/org/apache/polygene/api/constraint/ValueConstraintViolation.java
new file mode 100644
index 0000000..1da5a4b
--- /dev/null
+++ b/core/api/src/main/java/org/apache/polygene/api/constraint/ValueConstraintViolation.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+
+package org.apache.polygene.api.constraint;
+
+import java.lang.annotation.Annotation;
+import java.util.List;
+
+/**
+ * When a constraint violation has occurred (ie Constraint.isValid has returned false) it
+ * is put in a collection of all violations that have occurred for this value check.
+ */
+public final class ValueConstraintViolation
+{
+ private final String name;
+ private final Annotation constraint;
+ private final Object value;
+ private Class> mixinType;
+ private String methodName;
+
+ public ValueConstraintViolation( String name, Annotation constraint, Object value )
+ {
+ this.name = name;
+ this.constraint = constraint;
+ this.value = value;
+ }
+
+ public String name()
+ {
+ return name;
+ }
+
+ public Annotation constraint()
+ {
+ return constraint;
+ }
+
+ public Object value()
+ {
+ return value;
+ }
+
+ public void setMixinType( Class> mixinType )
+ {
+ this.mixinType = mixinType;
+ }
+
+ public void setMethodName( String methodName )
+ {
+ this.methodName = methodName;
+ }
+
+ public Class> mixinType()
+ {
+ return mixinType;
+ }
+
+ public String methodName()
+ {
+ return methodName;
+ }
+}
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/api/src/main/java/org/apache/polygene/api/object/NoSuchObjectException.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/object/NoSuchObjectException.java b/core/api/src/main/java/org/apache/polygene/api/object/NoSuchObjectException.java
deleted file mode 100644
index 82b63bd..0000000
--- a/core/api/src/main/java/org/apache/polygene/api/object/NoSuchObjectException.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *
- */
-package org.apache.polygene.api.object;
-
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-import org.apache.polygene.api.common.InvalidApplicationException;
-
-/**
- * This exception is thrown if no visible Object of the requested type can be found.
- */
-public class NoSuchObjectException
- extends InvalidApplicationException
-{
- private static final long serialVersionUID = -1121690536365682511L;
-
- private final String objectType;
- private final String moduleName;
-
- public NoSuchObjectException( String type, String moduleName, Stream> visible )
- {
- super( "Could not find any visible Object of type [" + type + "] in module ["
- + moduleName
- + "]. The visible types are: \n"
- + visible.map( Class::getName ).collect( Collectors.joining("\n") )
- );
- this.objectType = type;
- this.moduleName = moduleName;
- }
-
- public String objectType()
- {
- return objectType;
- }
-
- public String moduleName()
- {
- return moduleName;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/api/src/main/java/org/apache/polygene/api/object/NoSuchObjectTypeException.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/object/NoSuchObjectTypeException.java b/core/api/src/main/java/org/apache/polygene/api/object/NoSuchObjectTypeException.java
new file mode 100644
index 0000000..af1801f
--- /dev/null
+++ b/core/api/src/main/java/org/apache/polygene/api/object/NoSuchObjectTypeException.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+package org.apache.polygene.api.object;
+
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import org.apache.polygene.api.common.InvalidApplicationException;
+
+/**
+ * This exception is thrown if no visible Object of the requested type can be found.
+ */
+public class NoSuchObjectTypeException
+ extends InvalidApplicationException
+{
+ private static final long serialVersionUID = -1121690536365682511L;
+
+ private final String objectType;
+ private final String moduleName;
+
+ public NoSuchObjectTypeException( String type, String moduleName, Stream> visible )
+ {
+ super( "Could not find any visible Object of type [" + type + "] in module ["
+ + moduleName
+ + "]. The visible types are: \n"
+ + visible.map( Class::getName ).collect( Collectors.joining("\n") )
+ );
+ this.objectType = type;
+ this.moduleName = moduleName;
+ }
+
+ public String objectType()
+ {
+ return objectType;
+ }
+
+ public String moduleName()
+ {
+ return moduleName;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/api/src/main/java/org/apache/polygene/api/object/ObjectFactory.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/object/ObjectFactory.java b/core/api/src/main/java/org/apache/polygene/api/object/ObjectFactory.java
index fddeeb1..a13a5bf 100644
--- a/core/api/src/main/java/org/apache/polygene/api/object/ObjectFactory.java
+++ b/core/api/src/main/java/org/apache/polygene/api/object/ObjectFactory.java
@@ -36,10 +36,10 @@ public interface ObjectFactory
* @return new objects.
*
* @throws ConstructionException Thrown if instantiation fails.
- * @throws NoSuchObjectException Thrown if {@code type} class is not an object.
+ * @throws NoSuchObjectTypeException Thrown if {@code type} class is not an object.
*/
T newObject( Class type, Object... uses )
- throws NoSuchObjectException, ConstructionException;
+ throws NoSuchObjectTypeException, ConstructionException;
/**
* Inject an existing instance. Only fields and methods will be called.
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/api/src/main/java/org/apache/polygene/api/service/NoSuchServiceException.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/service/NoSuchServiceException.java b/core/api/src/main/java/org/apache/polygene/api/service/NoSuchServiceException.java
deleted file mode 100644
index 3b98272..0000000
--- a/core/api/src/main/java/org/apache/polygene/api/service/NoSuchServiceException.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *
- */
-
-package org.apache.polygene.api.service;
-
-import java.util.stream.Collectors;
-import org.apache.polygene.api.composite.CompositeDescriptor;
-import org.apache.polygene.api.composite.ModelDescriptor;
-import org.apache.polygene.api.composite.NoSuchCompositeException;
-import org.apache.polygene.api.structure.TypeLookup;
-
-/**
- * Thrown when no visible service of the requested type is found.
- */
-public class NoSuchServiceException extends NoSuchCompositeException
-{
- public NoSuchServiceException( String typeName, String moduleName, TypeLookup typeLookup )
- {
- super( "ServiceComposite", typeName, moduleName, formatVisibleTypes( typeLookup ) );
- }
-
- private static String formatVisibleTypes( TypeLookup typeLookup )
- {
- return typeLookup.allServices()
- .map( NoSuchServiceException::typeOf )
- .collect( Collectors.joining( "\n", "Visible service types are:\n", "" ) );
- }
-
- private static String typeOf( ModelDescriptor descriptor )
- {
- if( descriptor instanceof CompositeDescriptor )
- {
- return ( (CompositeDescriptor) descriptor ).primaryType().getName();
- }
- return descriptor.types()
- .map( Class::getName )
- .sorted()
- .distinct()
- .collect( Collectors.joining( ",", "[", "]") );
- }
-}
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/api/src/main/java/org/apache/polygene/api/service/NoSuchServiceTypeException.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/service/NoSuchServiceTypeException.java b/core/api/src/main/java/org/apache/polygene/api/service/NoSuchServiceTypeException.java
new file mode 100644
index 0000000..cc43627
--- /dev/null
+++ b/core/api/src/main/java/org/apache/polygene/api/service/NoSuchServiceTypeException.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+
+package org.apache.polygene.api.service;
+
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import org.apache.polygene.api.composite.CompositeDescriptor;
+import org.apache.polygene.api.composite.ModelDescriptor;
+import org.apache.polygene.api.composite.NoSuchCompositeTypeException;
+import org.apache.polygene.api.structure.TypeLookup;
+
+/**
+ * Thrown when no visible service of the requested type is found.
+ */
+public class NoSuchServiceTypeException extends NoSuchCompositeTypeException
+{
+ public NoSuchServiceTypeException( String typeName, String moduleName, TypeLookup typeLookup )
+ {
+ super( "ServiceComposite", typeName, moduleName, typeLookup );
+ }
+
+ @Override
+ protected Stream extends CompositeDescriptor> descriptors( TypeLookup typeLookup )
+ {
+ return typeLookup.allServices()
+ .filter( descriptor -> descriptor instanceof ServiceDescriptor )
+ .map( descriptor -> (ServiceDescriptor) descriptor );
+ }
+}
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/api/src/main/java/org/apache/polygene/api/service/ServiceFinder.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/service/ServiceFinder.java b/core/api/src/main/java/org/apache/polygene/api/service/ServiceFinder.java
index 8e7e9d5..28389ae 100644
--- a/core/api/src/main/java/org/apache/polygene/api/service/ServiceFinder.java
+++ b/core/api/src/main/java/org/apache/polygene/api/service/ServiceFinder.java
@@ -50,10 +50,10 @@ public interface ServiceFinder
*
* @return a ServiceReference if one is found
*
- * @throws NoSuchServiceException if no service of serviceType is found
+ * @throws NoSuchServiceTypeException if no service of serviceType is found
*/
ServiceReference findService( Class serviceType )
- throws NoSuchServiceException;
+ throws NoSuchServiceTypeException;
/**
* Find a ServiceReference that implements the given type.
@@ -63,10 +63,10 @@ public interface ServiceFinder
*
* @return a ServiceReference if one is found
*
- * @throws NoSuchServiceException if no service of serviceType is found
+ * @throws NoSuchServiceTypeException if no service of serviceType is found
*/
ServiceReference findService( Type serviceType )
- throws NoSuchServiceException;
+ throws NoSuchServiceTypeException;
/**
* Find ServiceReferences that implements the given type.
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/api/src/main/java/org/apache/polygene/api/unitofwork/NoSuchEntityTypeException.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/unitofwork/NoSuchEntityTypeException.java b/core/api/src/main/java/org/apache/polygene/api/unitofwork/NoSuchEntityTypeException.java
index d6dbe8d..a020c6e 100644
--- a/core/api/src/main/java/org/apache/polygene/api/unitofwork/NoSuchEntityTypeException.java
+++ b/core/api/src/main/java/org/apache/polygene/api/unitofwork/NoSuchEntityTypeException.java
@@ -19,7 +19,9 @@
*/
package org.apache.polygene.api.unitofwork;
-import org.apache.polygene.api.composite.NoSuchCompositeException;
+import java.util.stream.Stream;
+import org.apache.polygene.api.composite.CompositeDescriptor;
+import org.apache.polygene.api.composite.NoSuchCompositeTypeException;
import org.apache.polygene.api.structure.TypeLookup;
import static java.util.stream.Collectors.joining;
@@ -29,23 +31,16 @@ import static java.util.stream.Collectors.joining;
* was not found during a lookup call.
*/
public class NoSuchEntityTypeException
- extends NoSuchCompositeException
+ extends NoSuchCompositeTypeException
{
public NoSuchEntityTypeException( String typeName, String moduleName, TypeLookup typeLookup )
{
- super( "EntityComposite", typeName, moduleName, formatVisibleTypes( typeLookup ) );
+ super( "EntityComposite", typeName, moduleName, typeLookup );
}
- private static String formatVisibleTypes( TypeLookup typeLookup )
+ @Override
+ protected Stream extends CompositeDescriptor> descriptors( TypeLookup typeLookup )
{
- return typeLookup.allEntities()
- .map( descriptor -> {
- String moduleName = descriptor.module().name();
- String entityClassName = descriptor.primaryType().getName();
- return entityClassName + " in " + moduleName;
- } )
- .sorted()
- .distinct()
- .collect( joining( "\n", "Visible entity types are:\n", "" ) );
+ return typeLookup.allEntities();
}
}
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/api/src/main/java/org/apache/polygene/api/unitofwork/UnitOfWork.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/unitofwork/UnitOfWork.java b/core/api/src/main/java/org/apache/polygene/api/unitofwork/UnitOfWork.java
index badbe4c..168a55c 100644
--- a/core/api/src/main/java/org/apache/polygene/api/unitofwork/UnitOfWork.java
+++ b/core/api/src/main/java/org/apache/polygene/api/unitofwork/UnitOfWork.java
@@ -23,7 +23,6 @@ import java.time.Instant;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.stream.Stream;
import org.apache.polygene.api.association.AssociationDescriptor;
@@ -42,7 +41,6 @@ import org.apache.polygene.api.query.QueryBuilder;
import org.apache.polygene.api.structure.MetaInfoHolder;
import org.apache.polygene.api.structure.ModuleDescriptor;
import org.apache.polygene.api.usecase.Usecase;
-import org.apache.polygene.api.value.ValueBuilder;
/**
* All operations on entities goes through an UnitOfWork.
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/api/src/main/java/org/apache/polygene/api/value/NoSuchValueException.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/value/NoSuchValueException.java b/core/api/src/main/java/org/apache/polygene/api/value/NoSuchValueException.java
deleted file mode 100644
index b62b8e1..0000000
--- a/core/api/src/main/java/org/apache/polygene/api/value/NoSuchValueException.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *
- */
-package org.apache.polygene.api.value;
-
-import org.apache.polygene.api.composite.NoSuchCompositeException;
-import org.apache.polygene.api.structure.TypeLookup;
-
-import static java.util.stream.Collectors.joining;
-
-/**
- * Thrown when no visible value of the requested type is found.
- */
-public class NoSuchValueException
- extends NoSuchCompositeException
-{
- public NoSuchValueException( String valueType, String moduleName, TypeLookup typeLookup )
- {
- super( "ValueComposite", valueType, moduleName, formatVisibleTypes( typeLookup ) );
- }
-
- private static String formatVisibleTypes( TypeLookup typeLookup )
- {
- return typeLookup.allValues()
- .map( descriptor -> descriptor.primaryType().getName() )
- .sorted()
- .distinct()
- .collect( joining( "\n", "Visible value types are:\n", "" ) );
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/api/src/main/java/org/apache/polygene/api/value/NoSuchValueTypeException.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/value/NoSuchValueTypeException.java b/core/api/src/main/java/org/apache/polygene/api/value/NoSuchValueTypeException.java
new file mode 100644
index 0000000..77d2dc5
--- /dev/null
+++ b/core/api/src/main/java/org/apache/polygene/api/value/NoSuchValueTypeException.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+package org.apache.polygene.api.value;
+
+import java.util.stream.Stream;
+import org.apache.polygene.api.composite.CompositeDescriptor;
+import org.apache.polygene.api.composite.NoSuchCompositeTypeException;
+import org.apache.polygene.api.structure.TypeLookup;
+
+import static java.util.stream.Collectors.joining;
+
+/**
+ * Thrown when no visible value of the requested type is found.
+ */
+public class NoSuchValueTypeException
+ extends NoSuchCompositeTypeException
+{
+ public NoSuchValueTypeException( String valueType, String moduleName, TypeLookup typeLookup )
+ {
+ super( "ValueComposite", valueType, moduleName, typeLookup );
+ }
+
+ @Override
+ protected Stream extends CompositeDescriptor> descriptors( TypeLookup typeLookup )
+ {
+ return typeLookup.allValues();
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/api/src/main/java/org/apache/polygene/api/value/ValueBuilderFactory.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/value/ValueBuilderFactory.java b/core/api/src/main/java/org/apache/polygene/api/value/ValueBuilderFactory.java
index 510c373..65cce37 100644
--- a/core/api/src/main/java/org/apache/polygene/api/value/ValueBuilderFactory.java
+++ b/core/api/src/main/java/org/apache/polygene/api/value/ValueBuilderFactory.java
@@ -41,11 +41,11 @@ public interface ValueBuilderFactory
*
* @return a new Value instance
*
- * @throws NoSuchValueException if no value extending the mixinType has been registered
+ * @throws NoSuchValueTypeException if no value extending the mixinType has been registered
* @throws ConstructionException if the value could not be instantiated
*/
T newValue( Class valueType )
- throws NoSuchValueException, ConstructionException;
+ throws NoSuchValueTypeException, ConstructionException;
/**
* Create a builder for creating new Values that implements the given Value type.
@@ -56,10 +56,10 @@ public interface ValueBuilderFactory
*
* @return a ValueBuilder for creation of ValueComposites implementing the interface
*
- * @throws NoSuchValueException if no value extending the mixinType has been registered
+ * @throws NoSuchValueTypeException if no value extending the mixinType has been registered
*/
ValueBuilder newValueBuilder( Class valueType )
- throws NoSuchValueException;
+ throws NoSuchValueTypeException;
/**
* Create a builder for creating a new Value starting with the given prototype.
@@ -70,7 +70,7 @@ public interface ValueBuilderFactory
*
* @return a ValueBuilder for creation of ValueComposites implementing the interface of the prototype
*
- * @throws NoSuchValueException if no value extending the mixinType has been registered
+ * @throws NoSuchValueTypeException if no value extending the mixinType has been registered
*/
ValueBuilder newValueBuilderWithPrototype( T prototype );
@@ -87,7 +87,7 @@ public interface ValueBuilderFactory
*
* @return a ValueBuilder for creation of ValueComposites implementing the interface
*
- * @throws NoSuchValueException if no value extending the mixinType has been registered
+ * @throws NoSuchValueTypeException if no value extending the mixinType has been registered
*/
ValueBuilder newValueBuilderWithState( Class mixinType,
Function propertyFunction,
@@ -104,7 +104,7 @@ public interface ValueBuilderFactory
*
* @return a new Value instance
*
- * @throws NoSuchValueException if no value extending the mixinType has been registered
+ * @throws NoSuchValueTypeException if no value extending the mixinType has been registered
* @throws ConstructionException if the value could not be instantiated
*/
T newValueFromSerializedState( Class valueType, String serializedState );
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/AssemblyReportException.java
----------------------------------------------------------------------
diff --git a/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/AssemblyReportException.java b/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/AssemblyReportException.java
index f3c933c..4a2211e 100644
--- a/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/AssemblyReportException.java
+++ b/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/AssemblyReportException.java
@@ -22,6 +22,7 @@ package org.apache.polygene.bootstrap;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.List;
+import java.util.Set;
import java.util.stream.Collectors;
/**
@@ -29,10 +30,10 @@ import java.util.stream.Collectors;
*/
public class AssemblyReportException extends AssemblyException
{
- private List problems;
+ private Set problems;
private String modelReport;
- public AssemblyReportException( List problems )
+ public AssemblyReportException( Set problems )
{
this.problems = problems;
}
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/runtime/src/main/java/org/apache/polygene/runtime/association/AbstractAssociationModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/association/AbstractAssociationModel.java b/core/runtime/src/main/java/org/apache/polygene/runtime/association/AbstractAssociationModel.java
index 052ba02..166c601 100644
--- a/core/runtime/src/main/java/org/apache/polygene/runtime/association/AbstractAssociationModel.java
+++ b/core/runtime/src/main/java/org/apache/polygene/runtime/association/AbstractAssociationModel.java
@@ -123,19 +123,13 @@ public class AbstractAssociationModel
public void checkConstraints( Object value )
throws ConstraintViolationException
{
- if( constraints != null )
- {
- constraints.checkConstraints( value, accessor );
- }
+ constraints.checkConstraints( value, accessor );
}
public void checkAssociationConstraints( AbstractAssociation association )
throws ConstraintViolationException
{
- if( associationConstraints != null )
- {
- associationConstraints.checkConstraints( association, accessor );
- }
+ associationConstraints.checkConstraints( association, accessor );
}
public AssociationInfo builderInfo()
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/CompositeAssemblyImpl.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/CompositeAssemblyImpl.java b/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/CompositeAssemblyImpl.java
index bc3993b..cb1c751 100644
--- a/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/CompositeAssemblyImpl.java
+++ b/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/CompositeAssemblyImpl.java
@@ -26,6 +26,7 @@ import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
+import java.lang.reflect.Parameter;
import java.lang.reflect.Proxy;
import java.lang.reflect.Type;
import java.util.ArrayList;
@@ -210,7 +211,7 @@ public abstract class CompositeAssemblyImpl
List> mixinClasses
)
{
- List exceptions = new ArrayList<>();
+ Set exceptions = new HashSet<>();
Set> thisDependencies = new HashSet<>();
types.stream()
.peek( mixinType -> mixinsModel.addMixinType( mixinType ) )
@@ -259,7 +260,7 @@ public abstract class CompositeAssemblyImpl
List> constraintClasses,
List> concernClasses,
List> sideEffectClasses,
- List exceptions,
+ Set exceptions,
Set> thisDependencies )
{
try
@@ -476,11 +477,7 @@ public abstract class CompositeAssemblyImpl
optional,
constraintClasses,
accessor );
- ValueConstraintsInstance valueConstraintsInstance = null;
- if( valueConstraintsModel.isConstrained() )
- {
- valueConstraintsInstance = valueConstraintsModel.newInstance();
- }
+ ValueConstraintsInstance valueConstraintsInstance = valueConstraintsModel.newInstance();
MetaInfo metaInfo = stateDeclarations.metaInfoFor( accessor );
UseDefaults useDefaultsDeclaration = metaInfo.get( UseDefaults.class );
Object initialValue = stateDeclarations.initialValueOf( accessor );
@@ -506,17 +503,19 @@ public abstract class CompositeAssemblyImpl
)
{
List parameterConstraintModels = Collections.emptyList();
- Annotation[][] parameterAnnotations = method.getParameterAnnotations();
+
+ Parameter[] parameters = method.getParameters();
Type[] parameterTypes = method.getGenericParameterTypes();
boolean constrained = false;
- for( int i = 0; i < parameterAnnotations.length; i++ )
+ for( int i = 0; i < parameters.length; i++ )
{
- Annotation[] parameterAnnotation = parameterAnnotations[ i ];
+ Parameter param = parameters[i];
+
+ Annotation[] parameterAnnotation = param.getAnnotations();
Name nameAnnotation = (Name) of( parameterAnnotation ).filter( isType( Name.class ) )
.findFirst().orElse( null );
- String name = nameAnnotation == null ? "param" + ( i + 1 ) : nameAnnotation.value();
-
+ String name = nameAnnotation == null ? param.getName() : nameAnnotation.value();
boolean optional = of( parameterAnnotation )
.anyMatch( isType( Optional.class ) );
ValueConstraintsModel parameterConstraintsModel = constraintsFor(
@@ -865,29 +864,23 @@ public abstract class CompositeAssemblyImpl
boolean optional = annotations.stream().anyMatch( isType( Optional.class ) );
// Constraints for Association references
- ValueConstraintsModel constraintsModel = constraintsFor( annotations.stream(), GenericAssociationInfo
- .associationTypeOf( accessor ), ( (Member) accessor ).getName(), optional, constraintClasses, accessor );
- ValueConstraintsInstance valueConstraintsInstance;
- if( constraintsModel.isConstrained() )
- {
- valueConstraintsInstance = constraintsModel.newInstance();
- }
- else
- {
- valueConstraintsInstance = new ValueConstraintsInstance( Collections.emptyList(), ( (Member) accessor ).getName(), true );
- }
+ ValueConstraintsModel constraintsModel =
+ constraintsFor( annotations.stream(),
+ GenericAssociationInfo.associationTypeOf( accessor ),
+ ( (Member) accessor ).getName(),
+ optional,
+ constraintClasses,
+ accessor );
+ ValueConstraintsInstance valueConstraintsInstance = constraintsModel.newInstance();
// Constraints for the Association itself
- constraintsModel = constraintsFor( annotations.stream(), Association.class, ( (Member) accessor ).getName(), optional, constraintClasses, accessor );
- ValueConstraintsInstance associationValueConstraintsInstance;
- if( constraintsModel.isConstrained() )
- {
- associationValueConstraintsInstance = constraintsModel.newInstance();
- }
- else
- {
- associationValueConstraintsInstance = new ValueConstraintsInstance( Collections.emptyList(), ( (Member) accessor ).getName(), true );
- }
+ constraintsModel = constraintsFor( annotations.stream(),
+ Association.class,
+ ( (Member) accessor ).getName(),
+ optional,
+ constraintClasses,
+ accessor );
+ ValueConstraintsInstance associationValueConstraintsInstance = constraintsModel.newInstance();
MetaInfo metaInfo = stateDeclarations.metaInfoFor( accessor );
return new AssociationModel( accessor, valueConstraintsInstance, associationValueConstraintsInstance, metaInfo );
@@ -901,21 +894,24 @@ public abstract class CompositeAssemblyImpl
boolean optional = annotations.stream().anyMatch( isType( Optional.class ) );
// Constraints for entities in ManyAssociation
- ValueConstraintsModel valueConstraintsModel = constraintsFor( annotations.stream(), GenericAssociationInfo
- .associationTypeOf( accessor ), ( (Member) accessor ).getName(), optional, constraintClasses, accessor );
- ValueConstraintsInstance valueConstraintsInstance = null;
- if( valueConstraintsModel.isConstrained() )
- {
- valueConstraintsInstance = valueConstraintsModel.newInstance();
- }
+ ValueConstraintsModel valueConstraintsModel =
+ constraintsFor( annotations.stream(),
+ GenericAssociationInfo.associationTypeOf( accessor ),
+ ( (Member) accessor ).getName(),
+ optional,
+ constraintClasses,
+ accessor );
+ ValueConstraintsInstance valueConstraintsInstance = valueConstraintsModel.newInstance();
// Constraints for the ManyAssociation itself
- valueConstraintsModel = constraintsFor( annotations.stream(), ManyAssociation.class, ( (Member) accessor ).getName(), optional, constraintClasses, accessor );
- ValueConstraintsInstance manyValueConstraintsInstance = null;
- if( valueConstraintsModel.isConstrained() )
- {
- manyValueConstraintsInstance = valueConstraintsModel.newInstance();
- }
+ valueConstraintsModel = constraintsFor( annotations.stream(),
+ ManyAssociation.class,
+ ( (Member) accessor ).getName(),
+ optional,
+ constraintClasses,
+ accessor );
+ ValueConstraintsInstance manyValueConstraintsInstance = valueConstraintsModel.newInstance();
+
MetaInfo metaInfo = stateDeclarations.metaInfoFor( accessor );
return new ManyAssociationModel( accessor, valueConstraintsInstance, manyValueConstraintsInstance, metaInfo );
}
@@ -928,21 +924,24 @@ public abstract class CompositeAssemblyImpl
boolean optional = annotations.stream().anyMatch( isType( Optional.class ) );
// Constraints for entities in NamedAssociation
- ValueConstraintsModel valueConstraintsModel = constraintsFor( annotations.stream(), GenericAssociationInfo
- .associationTypeOf( accessor ), ( (Member) accessor ).getName(), optional, constraintClasses, accessor );
- ValueConstraintsInstance valueConstraintsInstance = null;
- if( valueConstraintsModel.isConstrained() )
- {
- valueConstraintsInstance = valueConstraintsModel.newInstance();
- }
+ ValueConstraintsModel valueConstraintsModel =
+ constraintsFor( annotations.stream(),
+ GenericAssociationInfo.associationTypeOf( accessor ),
+ ( (Member) accessor ).getName(),
+ optional,
+ constraintClasses,
+ accessor );
+ ValueConstraintsInstance valueConstraintsInstance = valueConstraintsModel.newInstance();
// Constraints for the NamedAssociation itself
- valueConstraintsModel = constraintsFor( annotations.stream(), NamedAssociation.class, ( (Member) accessor ).getName(), optional, constraintClasses, accessor );
- ValueConstraintsInstance namedValueConstraintsInstance = null;
- if( valueConstraintsModel.isConstrained() )
- {
- namedValueConstraintsInstance = valueConstraintsModel.newInstance();
- }
+ valueConstraintsModel = constraintsFor( annotations.stream(),
+ NamedAssociation.class,
+ ( (Member) accessor ).getName(),
+ optional,
+ constraintClasses,
+ accessor );
+ ValueConstraintsInstance namedValueConstraintsInstance = valueConstraintsModel.newInstance();
+
MetaInfo metaInfo = stateDeclarations.metaInfoFor( accessor );
return new NamedAssociationModel( accessor, valueConstraintsInstance, namedValueConstraintsInstance, metaInfo );
}
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/ModuleAssemblyImpl.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/ModuleAssemblyImpl.java b/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/ModuleAssemblyImpl.java
index 5c30117..d4cfa29 100644
--- a/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/ModuleAssemblyImpl.java
+++ b/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/ModuleAssemblyImpl.java
@@ -525,7 +525,7 @@ final class ModuleAssemblyImpl
throws AssemblyException
{
addRequiredAssemblers();
- List exceptions = new ArrayList<>();
+ Set exceptions = new HashSet<>();
List transientModels = new ArrayList<>();
List objectModels = new ArrayList<>();
List valueModels = new ArrayList<>();
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/runtime/src/main/java/org/apache/polygene/runtime/composite/CompositeModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/CompositeModel.java b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/CompositeModel.java
index 59ad428..72ab757 100644
--- a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/CompositeModel.java
+++ b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/CompositeModel.java
@@ -32,6 +32,7 @@ import org.apache.polygene.api.common.MetaInfo;
import org.apache.polygene.api.common.Visibility;
import org.apache.polygene.api.composite.Composite;
import org.apache.polygene.api.composite.CompositeDescriptor;
+import org.apache.polygene.api.constraint.ConstraintViolationException;
import org.apache.polygene.api.structure.ModuleDescriptor;
import org.apache.polygene.api.util.AccessibleObjects;
import org.apache.polygene.api.util.HierarchicalVisitor;
@@ -228,7 +229,15 @@ public abstract class CompositeModel
{
try
{
- return compositeMethodsModel.invoke( mixins, proxy, method, args, module );
+ try
+ {
+ return compositeMethodsModel.invoke( mixins, proxy, method, args, module );
+ }
+ catch( ConstraintViolationException e )
+ {
+ e.setCompositeDescriptor(this);
+ throw e;
+ }
}
catch( Throwable throwable )
{
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/runtime/src/main/java/org/apache/polygene/runtime/composite/ConstraintsInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/ConstraintsInstance.java b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/ConstraintsInstance.java
index 23e8f98..efa9521 100644
--- a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/ConstraintsInstance.java
+++ b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/ConstraintsInstance.java
@@ -23,11 +23,11 @@ package org.apache.polygene.runtime.composite;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
-import java.util.stream.Stream;
-import org.apache.polygene.api.composite.Composite;
import org.apache.polygene.api.composite.CompositeInstance;
-import org.apache.polygene.api.constraint.ConstraintViolation;
+import org.apache.polygene.api.constraint.ValueConstraintViolation;
import org.apache.polygene.api.constraint.ConstraintViolationException;
+import org.apache.polygene.api.identity.HasIdentity;
+import org.apache.polygene.api.identity.Identity;
/**
* JAVADOC
@@ -51,11 +51,11 @@ public final class ConstraintsInstance
}
// Check constraints
- List violations = null;
+ List violations = null;
for( int i = 0; i < params.length; i++ )
{
Object param = params[ i ];
- List paramViolations = valueConstraintsInstances.get( i ).checkConstraints( param );
+ List paramViolations = valueConstraintsInstances.get( i ).checkConstraints( param );
if( !paramViolations.isEmpty() )
{
if( violations == null )
@@ -69,16 +69,20 @@ public final class ConstraintsInstance
// Check if any constraint failed
if( violations != null )
{
- if( instance instanceof Composite )
+ for( ValueConstraintViolation violation : violations )
{
- throw new ConstraintViolationException( (Composite) instance, method, violations );
+ violation.setMixinType( method.getDeclaringClass() );
+ violation.setMethodName( method.getName() );
}
+ ConstraintViolationException exception = new ConstraintViolationException( violations );
+ Identity identity = instance instanceof HasIdentity ? ( (HasIdentity) instance ).identity().get() : null;
+ exception.setIdentity( identity );
if( instance instanceof CompositeInstance )
{
- throw new ConstraintViolationException( ( (CompositeInstance) instance ).proxy(), method, violations );
+ instance = ( (CompositeInstance) instance ).proxy();
}
- Stream> types = Stream.of( instance.getClass() );
- throw new ConstraintViolationException( instance.toString(), types, method, violations );
+ exception.setInstanceString( instance.toString() );
+ throw exception;
}
}
}
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/559b38a5/core/runtime/src/main/java/org/apache/polygene/runtime/composite/FragmentInvocationHandler.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/FragmentInvocationHandler.java b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/FragmentInvocationHandler.java
index f0dfca6..936db3c 100644
--- a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/FragmentInvocationHandler.java
+++ b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/FragmentInvocationHandler.java
@@ -84,7 +84,7 @@ abstract class FragmentInvocationHandler
// Stop removing if the originating method call has been located in the stack.
// For 'semi' and 'extensive' compaction, we don't and do the entire stack instead.
trace[ i ] = new StackTraceElement( proxy.getClass()
- .getInterfaces()[ 0 ].getName(), method.getName(), null, -1 );
+ .getInterfaces()[ 0 ].getName(), method.getName(), null, -1 );
break; // Stop compacting this trace
}
}
@@ -118,19 +118,22 @@ abstract class FragmentInvocationHandler
private boolean isApplicationClass( String className )
{
+ boolean jdkInternals = isJdkInternals( className );
if( compactLevel == CompactLevel.semi )
{
- return !isJdkInternals( className );
+ return !jdkInternals;
}
- return !( className.endsWith( FragmentClassLoader.GENERATED_POSTFIX ) ||
- className.startsWith( "org.apache.polygene.runtime" ) ||
- isJdkInternals( className ) );
+ boolean polygeneRuntime = className.startsWith( "org.apache.polygene.runtime" );
+ boolean stubClass = className.endsWith( FragmentClassLoader.GENERATED_POSTFIX );
+ return !( stubClass ||
+ polygeneRuntime ||
+ jdkInternals );
}
private boolean isJdkInternals( String className )
{
return className.startsWith( "java.lang.reflect" )
- || className.startsWith( "jdk.internal.reflect" )
+ || className.startsWith( "reflect" )
|| className.startsWith( "com.sun.proxy" )
|| className.startsWith( "sun.reflect" );
}