/** * 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.brixcms.jcr.api.wrapper; import org.brixcms.jcr.api.JcrSession; import org.brixcms.jcr.api.JcrSession.Behavior; import org.brixcms.jcr.exception.JcrException; import javax.jcr.RepositoryException; /** * @author Matej Knopp */ abstract class AbstractWrapper { private final Object delegate; private final JcrSession session; protected AbstractWrapper(Object delegate, JcrSession session) { if (delegate == null) { throw new IllegalArgumentException("Argument 'delegate' may not be null."); } this.delegate = delegate; this.session = session; } public Object getDelegate() { return delegate; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj instanceof AbstractWrapper == false) { return false; } AbstractWrapper that = (AbstractWrapper) obj; return delegate == that.delegate || delegate.equals(that.delegate); } @Override public int hashCode() { return delegate.hashCode(); } // -------------------------- OTHER METHODS -------------------------- protected <T> T executeCallback(Callback<T> callback) { if (callback == null) { throw new IllegalArgumentException("Argument 'callback' may not be null."); } try { return callback.execute(); } catch (Exception e) { handleException(e); } return null; } protected void handleException(Exception e) { // TODO: This is definitely not what we want to do. // Inspect the exception and register flash messages for certain // exceptions (versioning, locking, ...) Behavior behavior = getJcrSession().getBehavior(); if (behavior != null) { behavior.handleException(e); } else { if (e instanceof RepositoryException) { throw new JcrException((RepositoryException) e); } else { throw new RuntimeException(e); } } } protected void executeCallback(VoidCallback callback) { if (callback == null) { throw new IllegalArgumentException("Argument 'callback' may not be null."); } try { callback.execute(); } catch (Exception e) { handleException(e); } } protected JcrSession getJcrSession() { return session; } @SuppressWarnings("unchecked") protected <T> T unwrap(T wrapper) { while (wrapper instanceof AbstractWrapper) { wrapper = (T) ((AbstractWrapper) wrapper).getDelegate(); } return wrapper; } public <T> T[] unwrap(T original[], T newArray[]) { for (int i = 0; i < original.length; ++i) { newArray[i] = unwrap(original[i]); } return newArray; } protected interface Callback<T> { public T execute() throws Exception; } protected interface VoidCallback { public void execute() throws Exception; } }