/*
* ====================
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2008-2009 Sun Microsystems, Inc. All rights reserved.
*
* The contents of this file are subject to the terms of the Common Development
* and Distribution License("CDDL") (the "License"). You may not use this file
* except in compliance with the License.
*
* You can obtain a copy of the License at
* http://opensource.org/licenses/cddl1.php
* See the License for the specific language governing permissions and limitations
* under the License.
*
* When distributing the Covered Code, include this CDDL Header Notice in each file
* and include the License file at http://opensource.org/licenses/cddl1.php.
* If applicable, add the following below this CDDL Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
* ====================
*/
package org.identityconnectors.framework.impl.api;
import org.identityconnectors.common.Assertions;
import org.identityconnectors.framework.common.objects.ConnectorObject;
import org.identityconnectors.framework.common.objects.ResultsHandler;
import org.identityconnectors.framework.common.objects.SyncDelta;
import org.identityconnectors.framework.common.objects.SyncResultsHandler;
public class StreamHandlerUtil {
/**
* Adapts from a ObjectStreamHandler to a ResultsHandler
*/
private static class ResultsHandlerAdapter implements ResultsHandler {
private final ObjectStreamHandler target;
public ResultsHandlerAdapter(final ObjectStreamHandler target) {
this.target = target;
}
public boolean handle(final ConnectorObject obj) {
return target.handle(obj);
}
}
/**
* Adapts from a ObjectStreamHandler to a SyncResultsHandler
*/
private static class SyncResultsHandlerAdapter implements SyncResultsHandler {
private final ObjectStreamHandler target;
public SyncResultsHandlerAdapter(final ObjectStreamHandler target) {
this.target = target;
}
public boolean handle(final SyncDelta obj) {
return target.handle(obj);
}
}
/**
* Adapts from a ObjectStreamHandler to a SyncResultsHandler
*/
private static class ObjectStreamHandlerAdapter implements ObjectStreamHandler {
private final Class<?> targetInterface;
private final Object target;
public ObjectStreamHandlerAdapter(Class<?> targetInterface, Object target) {
Assertions.nullCheck(targetInterface, "targetInterface");
Assertions.nullCheck(target, "target");
if (!targetInterface.isInstance(target)) {
throw new IllegalArgumentException("Target" + targetInterface + " " + target);
}
if (!isAdaptableToObjectStreamHandler(targetInterface)) {
throw new IllegalArgumentException("Target interface not supported: "
+ targetInterface);
}
this.targetInterface = targetInterface;
this.target = target;
}
public boolean handle(final Object obj) {
if (targetInterface == ResultsHandler.class) {
return ((ResultsHandler) target).handle((ConnectorObject) obj);
} else if (targetInterface == SyncResultsHandler.class) {
return ((SyncResultsHandler) target).handle((SyncDelta) obj);
} else {
throw new UnsupportedOperationException("Unhandled case: " + targetInterface);
}
}
}
public static boolean isAdaptableToObjectStreamHandler(Class<?> clazz) {
return (ResultsHandler.class.isAssignableFrom(clazz) || SyncResultsHandler.class
.isAssignableFrom(clazz));
}
public static ObjectStreamHandler adaptToObjectStreamHandler(Class<?> interfaceType,
Object target) {
return new ObjectStreamHandlerAdapter(interfaceType, target);
}
public static Object adaptFromObjectStreamHandler(Class<?> interfaceType,
ObjectStreamHandler target) {
if (interfaceType == ResultsHandler.class) {
return new ResultsHandlerAdapter(target);
} else if (interfaceType == SyncResultsHandler.class) {
return new SyncResultsHandlerAdapter(target);
} else {
throw new UnsupportedOperationException("Unhandled case: " + interfaceType);
}
}
}