diff options
Diffstat (limited to 'src/java.corba/share/classes/com/sun/jndi/cosnaming/ExceptionMapper.java')
-rw-r--r-- | src/java.corba/share/classes/com/sun/jndi/cosnaming/ExceptionMapper.java | 247 |
1 files changed, 247 insertions, 0 deletions
diff --git a/src/java.corba/share/classes/com/sun/jndi/cosnaming/ExceptionMapper.java b/src/java.corba/share/classes/com/sun/jndi/cosnaming/ExceptionMapper.java new file mode 100644 index 0000000..1f626d5 --- /dev/null +++ b/src/java.corba/share/classes/com/sun/jndi/cosnaming/ExceptionMapper.java @@ -0,0 +1,247 @@ +/* + * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.jndi.cosnaming; + +import javax.naming.*; +import javax.naming.directory.*; +import javax.naming.spi.*; + +import org.omg.CosNaming.*; +import org.omg.CosNaming.NamingContextPackage.*; +import org.omg.CORBA.*; + +import com.sun.jndi.toolkit.corba.CorbaUtils; + +/** + * A convenience class to map the COS Naming exceptions to the JNDI exceptions. + * @author Raj Krishnamurthy + */ + +public final class ExceptionMapper { + private ExceptionMapper() {} // ensure no instance + private static final boolean debug = false; + + public static final NamingException mapException(Exception e, + CNCtx ctx, NameComponent[] inputName) throws NamingException { + if (e instanceof NamingException) { + return (NamingException)e; + } + + if (e instanceof RuntimeException) { + throw (RuntimeException)e; + } + + NamingException ne; + if (e instanceof NotFound) { + if (ctx.federation) { + return tryFed((NotFound)e, ctx, inputName); + + } else { + ne = new NameNotFoundException(); + } + + } else if (e instanceof CannotProceed) { + + ne = new CannotProceedException(); + NamingContext nc = ((CannotProceed) e).cxt; + NameComponent[] rest = ((CannotProceed) e).rest_of_name; + + // %%% We assume that rest returns *all* unprocessed components. + // Don't' know if that is a good assumption, given + // NotFound doesn't set rest as expected. -RL + if (inputName != null && (inputName.length > rest.length)) { + NameComponent[] resolvedName = + new NameComponent[inputName.length - rest.length]; + System.arraycopy(inputName, 0, resolvedName, 0, resolvedName.length); + // Wrap resolved NamingContext inside a CNCtx + // Guess that its name (which is relative to ctx) + // is the part of inputName minus rest_of_name + ne.setResolvedObj(new CNCtx(ctx._orb, ctx.orbTracker, nc, + ctx._env, + ctx.makeFullName(resolvedName))); + } else { + ne.setResolvedObj(ctx); + } + + ne.setRemainingName(CNNameParser.cosNameToName(rest)); + + } else if (e instanceof InvalidName) { + ne = new InvalidNameException(); + } else if (e instanceof AlreadyBound) { + ne = new NameAlreadyBoundException(); + } else if (e instanceof NotEmpty) { + ne = new ContextNotEmptyException(); + } else { + ne = new NamingException("Unknown reasons"); + } + + ne.setRootCause(e); + return ne; + } + + private static final NamingException tryFed(NotFound e, CNCtx ctx, + NameComponent[] inputName) throws NamingException { + NameComponent[] rest = e.rest_of_name; + + if (debug) { + System.out.println(e.why.value()); + System.out.println(rest.length); + } + + // %%% Using 1.2 & 1.3 Sun's tnameserv, 'rest' contains only the first + // component that failed, not *rest* as advertized. This is useless + // because what if you have something like aa/aa/aa/aa/aa. + // If one of those is not found, you get "aa" as 'rest'. + if (rest.length == 1 && inputName != null) { + // Check that we're not talking to 1.2/1.3 Sun tnameserv + NameComponent lastIn = inputName[inputName.length-1]; + if (rest[0].id.equals(lastIn.id) && + rest[0].kind != null && + rest[0].kind.equals(lastIn.kind)) { + // Might be legit + ; + } else { + // Due to 1.2/1.3 bug that always returns single-item 'rest' + NamingException ne = new NameNotFoundException(); + ne.setRemainingName(CNNameParser.cosNameToName(rest)); + ne.setRootCause(e); + throw ne; + } + } + // Fixed in 1.4; perform calculations based on correct (1.4) behavior + + // Calculate the components of the name that has been resolved + NameComponent[] resolvedName = null; + int len = 0; + if (inputName != null && (inputName.length >= rest.length)) { + + if (e.why == NotFoundReason.not_context) { + // First component of rest is found but not a context; keep it + // as part of resolved name + len = inputName.length - (rest.length - 1); + + // Remove resolved component from rest + if (rest.length == 1) { + // No more remaining + rest = null; + } else { + NameComponent[] tmp = new NameComponent[rest.length-1]; + System.arraycopy(rest, 1, tmp, 0, tmp.length); + rest = tmp; + } + } else { + len = inputName.length - rest.length; + } + + if (len > 0) { + resolvedName = new NameComponent[len]; + System.arraycopy(inputName, 0, resolvedName, 0, len); + } + } + + // Create CPE and set common fields + CannotProceedException cpe = new CannotProceedException(); + cpe.setRootCause(e); + if (rest != null && rest.length > 0) { + cpe.setRemainingName(CNNameParser.cosNameToName(rest)); + } + cpe.setEnvironment(ctx._env); + + if (debug) { + System.out.println("rest of name: " + cpe.getRemainingName()); + } + + // Lookup resolved name to get resolved object + final java.lang.Object resolvedObj = + (resolvedName != null) ? ctx.callResolve(resolvedName) : ctx; + + if (resolvedObj instanceof javax.naming.Context) { + // obj is a context and child is not found + // try getting its nns dynamically by constructing + // a Reference containing obj. + RefAddr addr = new RefAddr("nns") { + public java.lang.Object getContent() { + return resolvedObj; + } + private static final long serialVersionUID = + 669984699392133792L; + }; + Reference ref = new Reference("java.lang.Object", addr); + + // Resolved name has trailing slash to indicate nns + CompositeName cname = new CompositeName(); + cname.add(""); // add trailing slash + + cpe.setResolvedObj(ref); + cpe.setAltName(cname); + cpe.setAltNameCtx((javax.naming.Context)resolvedObj); + + return cpe; + } else { + // Not a context, use object factory to transform object. + + Name cname = CNNameParser.cosNameToName(resolvedName); + java.lang.Object resolvedObj2 = null; + try { + // Check whether object factory codebase is trusted + if (CorbaUtils.isObjectFactoryTrusted(resolvedObj)) { + resolvedObj2 = NamingManager.getObjectInstance(resolvedObj, + cname, ctx, ctx._env); + } + } catch (NamingException ge) { + throw ge; + } catch (Exception ge) { + NamingException ne = new NamingException( + "problem generating object using object factory"); + ne.setRootCause(ge); + throw ne; + } + + // If a context, continue operation with context + if (resolvedObj2 instanceof javax.naming.Context) { + cpe.setResolvedObj(resolvedObj2); + } else { + // Add trailing slash + cname.add(""); + cpe.setAltName(cname); + + // Create nns reference + final java.lang.Object rf2 = resolvedObj2; + RefAddr addr = new RefAddr("nns") { + public java.lang.Object getContent() { + return rf2; + } + private static final long serialVersionUID = + -785132553978269772L; + }; + Reference ref = new Reference("java.lang.Object", addr); + cpe.setResolvedObj(ref); + cpe.setAltNameCtx(ctx); + } + return cpe; + } + } +} |