You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wink.apache.org by gp...@apache.org on 2013/08/08 18:17:06 UTC
svn commit: r1511849 [2/2] - in /wink/2.x/trunk: ./ wink-bv-server/
wink-bv-server/src/ wink-bv-server/src/main/ wink-bv-server/src/main/java/
wink-bv-server/src/main/java/org/ wink-bv-server/src/main/java/org/apache/
wink-bv-server/src/main/java/org/a...
Modified: wink/2.x/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/InvokeMethodHandler.java
URL: http://svn.apache.org/viewvc/wink/2.x/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/InvokeMethodHandler.java?rev=1511849&r1=1511848&r2=1511849&view=diff
==============================================================================
--- wink/2.x/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/InvokeMethodHandler.java (original)
+++ wink/2.x/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/InvokeMethodHandler.java Thu Aug 8 16:17:04 2013
@@ -25,6 +25,7 @@ import java.util.Arrays;
import org.apache.wink.common.internal.application.ApplicationExceptionAttribute;
import org.apache.wink.common.internal.log.LogUtils;
+import org.apache.wink.server.internal.validation.InvocationValidator;
import org.apache.wink.server.handlers.AbstractHandler;
import org.apache.wink.server.handlers.MessageContext;
import org.apache.wink.server.internal.log.ResourceInvocation.ResourceInvocationData;
@@ -41,11 +42,22 @@ public class InvokeMethodHandler extends
Method javaMethod = null;
Object instance = null;
Object[] parameters = null;
+ InvocationValidator invocationValidator;
try {
SearchResult searchResult = context.getAttribute(SearchResult.class);
javaMethod = searchResult.getMethod().getMetadata().getReflectionMethod();
parameters = searchResult.getInvocationParameters();
instance = searchResult.getResource().getInstance(context);
+
+ invocationValidator = context.getAttribute(InvocationValidator.class);
+
+ //TODO discuss combination with other frameworks (e.g. cdi 1.1 interceptor which does the same)
+ InvocationValidator.ValidationTask validationTask = null;
+ if (invocationValidator != null) {
+ validationTask = invocationValidator.createValidationTaskFor(context, instance, javaMethod, parameters);
+ validationTask.validateBeforeTargetInvocation();
+ }
+
if (logger.isTraceEnabled()) {
logger
.trace("Invoking method {} of declaring class {} on the instance of a class {}@{} with parameters {}", //$NON-NLS-1$
@@ -61,6 +73,11 @@ public class InvokeMethodHandler extends
resInvocationData.addInvocation(context);
}
Object result = javaMethod.invoke(instance, parameters);
+
+ if (validationTask != null) {
+ validationTask.validateInvocationResult(result);
+ }
+
context.setResponseEntity(result);
} catch (InvocationTargetException ite) {
try {
Modified: wink/2.x/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/ServerMessageContext.java
URL: http://svn.apache.org/viewvc/wink/2.x/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/ServerMessageContext.java?rev=1511849&r1=1511848&r2=1511849&view=diff
==============================================================================
--- wink/2.x/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/ServerMessageContext.java (original)
+++ wink/2.x/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/ServerMessageContext.java Thu Aug 8 16:17:04 2013
@@ -45,6 +45,7 @@ import org.apache.wink.common.internal.c
import org.apache.wink.common.internal.contexts.ProvidersImpl;
import org.apache.wink.common.internal.registry.ProvidersRegistry;
import org.apache.wink.common.internal.runtime.AbstractRuntimeContext;
+import org.apache.wink.server.internal.validation.InvocationValidator;
import org.apache.wink.server.handlers.MessageContext;
import org.apache.wink.server.internal.DeploymentConfiguration;
import org.apache.wink.server.internal.MediaTypeMapper;
@@ -89,6 +90,7 @@ public class ServerMessageContext extend
setAttribute(DeploymentConfiguration.class, configuration); // legacy
setAttribute(ResourceRegistry.class, configuration.getResourceRegistry());
setAttribute(ProvidersRegistry.class, configuration.getProvidersRegistry());
+ setAttribute(InvocationValidator.class, configuration.getInvocationValidator());
if (configuration.isDefaultResponseCharset() || configuration.isUseAcceptCharset()) {
setAttribute(MediaTypeCharsetAdjuster.class, ServerMediaTypeCharsetAdjuster.getInstance());
}
Modified: wink/2.x/trunk/wink-server/src/main/java/org/apache/wink/server/internal/servlet/RestServlet.java
URL: http://svn.apache.org/viewvc/wink/2.x/trunk/wink-server/src/main/java/org/apache/wink/server/internal/servlet/RestServlet.java?rev=1511849&r1=1511848&r2=1511849&view=diff
==============================================================================
--- wink/2.x/trunk/wink-server/src/main/java/org/apache/wink/server/internal/servlet/RestServlet.java (original)
+++ wink/2.x/trunk/wink-server/src/main/java/org/apache/wink/server/internal/servlet/RestServlet.java Thu Aug 8 16:17:04 2013
@@ -321,6 +321,10 @@ public class RestServlet extends Abstrac
of.releaseAll(null);
}
+ if (getRequestProcessor().getConfiguration().getInvocationValidator() != null) {
+ getRequestProcessor().getConfiguration().getInvocationValidator().reset();
+ }
+
/*
* Be sure to call super.destroy()
*/
Added: wink/2.x/trunk/wink-server/src/main/java/org/apache/wink/server/internal/validation/InvocationValidator.java
URL: http://svn.apache.org/viewvc/wink/2.x/trunk/wink-server/src/main/java/org/apache/wink/server/internal/validation/InvocationValidator.java?rev=1511849&view=auto
==============================================================================
--- wink/2.x/trunk/wink-server/src/main/java/org/apache/wink/server/internal/validation/InvocationValidator.java (added)
+++ wink/2.x/trunk/wink-server/src/main/java/org/apache/wink/server/internal/validation/InvocationValidator.java Thu Aug 8 16:17:04 2013
@@ -0,0 +1,59 @@
+/*
+ * 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.wink.server.internal.validation;
+
+import org.apache.wink.common.RuntimeContext;
+import org.apache.wink.common.internal.lifecycle.LifecycleManagersRegistry;
+import org.apache.wink.common.internal.registry.ProvidersRegistry;
+import org.apache.wink.server.handlers.MessageContext;
+
+import java.lang.reflect.Method;
+
+public interface InvocationValidator {
+ /**
+ * Allows to check if the validator can be bootstrapped.
+ * If it wasn't successful e.g. based on a config or due to missing dependencies,... and there are additional
+ * implementations of {@link InvocationValidator}, they get the chance.
+ * @param context needed to use {@link ObjectFactory} properly
+ * @param lifecycleManagersRegistry allows to get an {@link ObjectFactory} to do a lookup in the current environment,
+ * before a validator gets bootstrapped manually (e.g. cdi supports injection of a
+ * javax.validation.ValidatorFactory -> it isn't always needed to bootstrap it manually)
+ * @return true if bootstrapping was successful, false otherwise
+ */
+ boolean init(RuntimeContext context,
+ LifecycleManagersRegistry lifecycleManagersRegistry,
+ ProvidersRegistry providersRegistry);
+
+ ValidationTask createValidationTaskFor(MessageContext context,
+ Object invocationTargetInstance,
+ Method invocationTargetMethod,
+ Object... arguments);
+
+ /**
+ * Resets the internal state, e.g. in case of an application restart to void leaking caches,...
+ */
+ void reset();
+
+ interface ValidationTask {
+ ValidationTask validateBeforeTargetInvocation();
+
+ ValidationTask validateInvocationResult(Object result);
+ }
+}