You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ad...@apache.org on 2005/10/28 04:00:22 UTC
svn commit: r329036 [2/7] - in /geronimo/trunk/sandbox/freeorb: ./
geronimo-orb/ geronimo-orb/src/ geronimo-orb/src/main/
geronimo-orb/src/main/java/ geronimo-orb/src/main/java/org/
geronimo-orb/src/main/java/org/apache/ geronimo-orb/src/main/java/org/...
Added: geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/RepositoryID.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/RepositoryID.java?rev=329036&view=auto
==============================================================================
--- geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/RepositoryID.java (added)
+++ geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/RepositoryID.java Thu Oct 27 19:00:06 2005
@@ -0,0 +1,171 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * 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.apache.geronimo.corba;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.geronimo.corba.util.StringUtil;
+
+
+public abstract class RepositoryID {
+
+ static final Log log = LogFactory.getLog(RepositoryID.class);
+
+ public static String idToClassName(String repid) {
+ // debug
+ if (log.isDebugEnabled()) {
+ log.debug("idToClassName " + repid);
+ }
+
+ if (repid.startsWith("IDL:")) {
+
+ String id = repid;
+
+ try {
+ int end = id.lastIndexOf(':');
+ String s = end < 0
+ ? id.substring(4)
+ : id.substring(4, end);
+
+ StringBuffer bb = new StringBuffer();
+
+ //
+ // reverse order of dot-separated name components up
+ // till the first slash.
+ //
+ int firstSlash = s.indexOf('/');
+ if (firstSlash > 0) {
+ String prefix = s.substring(0, firstSlash);
+ String[] elems = StringUtil.split(prefix, '.');
+
+ for (int i = elems.length - 1; i >= 0; i--) {
+ bb.append(fixName(elems[i]));
+ bb.append('.');
+ }
+
+ s = s.substring(firstSlash + 1);
+ }
+
+ //
+ // Append slash-separated name components ...
+ //
+ String[] elems = StringUtil.split(s, '/');
+ for (int i = 0; i < elems.length; i++) {
+ bb.append(fixName(elems[i]));
+ if (i != elems.length - 1)
+ bb.append('.');
+ }
+
+ String result = bb.toString();
+
+ if (log.isDebugEnabled()) {
+ log.debug("idToClassName " + repid + " => " + result);
+ }
+
+ return result;
+ }
+ catch (IndexOutOfBoundsException ex) {
+ log.error("idToClass", ex);
+ return null;
+ }
+
+ } else if (repid.startsWith("RMI:")) {
+ int end = repid.indexOf(':', 4);
+ return end < 0
+ ? repid.substring(4)
+ : repid.substring(4, end);
+ }
+
+ return null;
+ }
+
+ static String fixName(String name) {
+
+ if (keyWords.contains(name)) {
+ StringBuffer buf = new StringBuffer();
+ buf.append('_');
+ buf.append(name);
+ return buf.toString();
+ }
+
+ String result = name;
+ String current = name;
+
+ boolean match = true;
+ while (match) {
+
+ int len = current.length();
+ match = false;
+
+ for (int i = 0; i < reservedPostfixes.length; i++) {
+ if (current.endsWith(reservedPostfixes[i])) {
+ StringBuffer buf = new StringBuffer();
+ buf.append('_');
+ buf.append(result);
+ result = buf.toString();
+
+ int resultLen = reservedPostfixes[i].length();
+ if (len > resultLen)
+ current = current.substring(0,
+ len - resultLen);
+ else
+ current = "";
+
+ match = true;
+ break;
+ }
+ }
+
+ }
+
+ return name;
+ }
+
+ static final java.util.Set keyWords = new java.util.HashSet();
+ static final String[] reservedPostfixes = new String[]{
+ "Helper",
+ "Holder",
+ "Operations",
+ "POA",
+ "POATie",
+ "Package",
+ "ValueFactory"
+ };
+
+ static {
+ String[] words = {
+ "abstract", "boolean", "break", "byte", "case", "catch",
+ "char", "class", "clone", "const", "continue", "default",
+ "do", "double", "else", "equals", "extends", "false",
+ "final", "finalize", "finally", "float", "for",
+ "getClass", "goto", "hashCode", "if", "implements",
+ "import", "instanceof", "int", "interface", "long",
+ "native", "new", "notify", "notifyAll", "null", "package",
+ "private", "protected", "public", "return", "short",
+ "static", "super", "switch", "synchronized", "this",
+ "throw", "throws", "toString", "transient", "true", "try",
+ "void", "volatile", "wait", "while"
+ };
+
+ for (int i = 0; i < words.length; i++) {
+ keyWords.add(words[i]);
+ }
+ }
+
+
+}
Added: geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/SingletonORB.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/SingletonORB.java?rev=329036&view=auto
==============================================================================
--- geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/SingletonORB.java (added)
+++ geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/SingletonORB.java Thu Oct 27 19:00:06 2005
@@ -0,0 +1,175 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * 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.apache.geronimo.corba;
+
+import org.apache.geronimo.corba.dii.EnvironmentImpl;
+import org.apache.geronimo.corba.dii.ExceptionListImpl;
+import org.apache.geronimo.corba.dii.NamedValueImpl;
+
+
+public class SingletonORB extends AbstractORB {
+
+ /**
+ * Public no-arg constructor
+ */
+ public SingletonORB() {
+ }
+
+ private void illegalSingletonOperation() {
+ throw new org.omg.CORBA.NO_IMPLEMENT(
+ "illegal operation on singleton ORB");
+ }
+
+ public String[] list_initial_services() {
+ illegalSingletonOperation();
+ return null;
+ }
+
+ public org.omg.CORBA.Object resolve_initial_references(String name)
+ throws org.omg.CORBA.ORBPackage.InvalidName
+ {
+ illegalSingletonOperation();
+ return null;
+ }
+
+ public void register_initial_reference(String name, org.omg.CORBA.Object obj)
+ throws org.omg.CORBA.ORBPackage.InvalidName
+ {
+ illegalSingletonOperation();
+ }
+
+ public String object_to_string(org.omg.CORBA.Object object) {
+ illegalSingletonOperation();
+ return null;
+ }
+
+ public org.omg.CORBA.Object string_to_object(String str) {
+ illegalSingletonOperation();
+ return null;
+ }
+
+ public org.omg.CORBA.NVList create_list(int count) {
+ illegalSingletonOperation();
+ return null;
+ }
+
+ public org.omg.CORBA.NVList create_operation_list(org.omg.CORBA.Object oper) {
+ illegalSingletonOperation();
+ return null;
+ }
+
+ public org.omg.CORBA.NamedValue create_named_value(String name,
+ org.omg.CORBA.Any value, int flags)
+ {
+ return new NamedValueImpl(name, value, flags);
+ }
+
+ public org.omg.CORBA.ExceptionList create_exception_list() {
+ return new ExceptionListImpl();
+ }
+
+ public org.omg.CORBA.ContextList create_context_list() {
+ illegalSingletonOperation();
+ return null;
+ }
+
+ public org.omg.CORBA.Context get_default_context() {
+ illegalSingletonOperation();
+ return null;
+ }
+
+ public org.omg.CORBA.Environment create_environment() {
+ return new EnvironmentImpl();
+ }
+
+ public void send_multiple_requests_oneway(org.omg.CORBA.Request[] requests) {
+ illegalSingletonOperation();
+ }
+
+ public void send_multiple_requests_deferred(org.omg.CORBA.Request[] requests) {
+ illegalSingletonOperation();
+ }
+
+ public boolean poll_next_response() {
+ illegalSingletonOperation();
+ return false;
+ }
+
+ public org.omg.CORBA.Request get_next_response()
+ throws org.omg.CORBA.WrongTransaction
+ {
+ illegalSingletonOperation();
+ return null;
+ }
+
+
+ public boolean work_pending() {
+ illegalSingletonOperation();
+ return false;
+ }
+
+ public void perform_work() {
+ illegalSingletonOperation();
+ }
+
+ public void run() {
+ illegalSingletonOperation();
+ }
+
+ public void shutdown(boolean wait_for_completion) {
+ illegalSingletonOperation();
+ }
+
+ public void destroy() {
+ illegalSingletonOperation();
+ }
+
+ public org.omg.CORBA.Any create_any() {
+ return new org.freeorb.AnyImpl(this);
+ }
+
+ public org.omg.CORBA.portable.OutputStream create_output_stream() {
+ illegalSingletonOperation();
+ return null;
+ }
+
+ public void connect(org.omg.CORBA.Object obj) {
+ illegalSingletonOperation();
+ }
+
+ public void disconnect(org.omg.CORBA.Object obj) {
+ illegalSingletonOperation();
+ }
+
+ public org.omg.CORBA.Policy create_policy(int policy_type,
+ org.omg.CORBA.Any val) throws org.omg.CORBA.PolicyError
+ {
+ illegalSingletonOperation();
+ return null;
+ }
+
+ protected void set_parameters(String[] args, java.util.Properties props) {
+ illegalSingletonOperation();
+ }
+
+ protected void set_parameters(java.applet.Applet app,
+ java.util.Properties props)
+ {
+ illegalSingletonOperation();
+ }
+
+}
Added: geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/TypeCodeImpl.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/TypeCodeImpl.java?rev=329036&view=auto
==============================================================================
--- geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/TypeCodeImpl.java (added)
+++ geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/TypeCodeImpl.java Thu Oct 27 19:00:06 2005
@@ -0,0 +1,605 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * 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.apache.geronimo.corba;
+
+import java.util.HashMap;
+import java.util.IdentityHashMap;
+import java.util.Map;
+
+import org.omg.CORBA.Any;
+import org.omg.CORBA.TCKind;
+import org.omg.CORBA.TypeCode;
+import org.omg.CORBA.TypeCodePackage.BadKind;
+import org.omg.CORBA.TypeCodePackage.Bounds;
+
+
+class TypeCodeImpl extends TypeCode {
+
+ public static class EquivalenceContext {
+
+ Map eqmap = new IdentityHashMap();
+
+ void add(TypeCode t1, TypeCode t2) {
+ _add(t1, t2);
+ _add(t2, t1);
+ }
+
+ private void _add(TypeCode t1, TypeCode t2) {
+ Map eqset = (Map) eqmap.get(t1);
+ if (eqset == null) {
+ eqset = new IdentityHashMap();
+ eqmap.put(t1, eqset);
+ }
+
+ Integer count = (Integer) eqset.get(t2);
+ if (count == null) {
+ count = new Integer(1);
+ eqset.put(t2, count);
+ } else {
+ eqset.put(t2, new Integer(count.intValue() + 1));
+ }
+ }
+
+ void remove(TypeCode t1, TypeCode t2) {
+
+ _remove(t1, t2);
+ _remove(t2, t1);
+
+ }
+
+ private void _remove(TypeCode t1, TypeCode t2) {
+ Map eqset = (Map) eqmap.get(t1);
+
+ if (eqset == null) return;
+
+ Integer count = (Integer) eqset.get(t2);
+ if (count == null) return;
+
+ int value = count.intValue();
+ if (value == 1) {
+ eqset.remove(t2);
+ } else {
+ eqset.put(t2, new Integer(value - 1));
+ }
+ }
+
+ boolean contains(TypeCode t1, TypeCode t2) {
+ return _contains(t1, t2) || _contains(t2, t1);
+ }
+
+ private boolean _contains(TypeCode t1, TypeCode t2) {
+ Map eqset = (Map) eqmap.get(t1);
+ if (eqset.containsKey(t2)) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+
+ TCKind kind;
+
+ // objref, struct, enum, alias, value, valuebox, native,
+ // abstract_interface and except
+ String id;
+ String name;
+
+ // struct, enum, value, except...
+ String[] memberNames;
+ TypeCodeImpl[] memberTypes;
+
+ // union
+ Any[] labels;
+ TypeCodeImpl discriminatorType;
+
+ // string, wstring, sequence, array
+ int length;
+
+ TypeCodeImpl contentType;
+
+ // fixed
+ short fixedDigits;
+ short fixedScale;
+
+ // value
+ short[] memberVisibility;
+ short typeModifier;
+ TypeCodeImpl concreteBaseType;
+
+ String recursiveId;
+ // TypeCodeImpl recursiveResolved;
+
+ //
+ // Public API
+ //
+ public boolean equal(TypeCode tc) {
+
+ if (tc == null)
+ return false;
+
+ if (tc == this)
+ return true;
+
+ return equal(tc, new EquivalenceContext());
+ }
+
+
+ //
+ // Public API
+ //
+ public boolean equal(TypeCode tc, EquivalenceContext ctx) {
+
+ if (tc == null)
+ return false;
+
+ if (tc == this)
+ return true;
+
+ if (ctx.contains(this, tc)) {
+ return true;
+ }
+
+ if (kind != tc.kind())
+ return false;
+
+ try {
+ ctx.add(this, tc);
+ return __equal(tc, ctx);
+ }
+ catch (BadKind e) {
+ return false;
+ }
+ catch (Bounds e) {
+ return false;
+ }
+ finally {
+ ctx.remove(this, tc);
+ }
+ }
+
+ protected boolean __equal(TypeCode tc, EquivalenceContext ctx) throws BadKind, Bounds {
+
+ switch (kind.value()) {
+ case TCKind._tk_objref:
+ case TCKind._tk_struct:
+ case TCKind._tk_union:
+ case TCKind._tk_enum:
+ case TCKind._tk_alias:
+ case TCKind._tk_value:
+ case TCKind._tk_value_box:
+ case TCKind._tk_native:
+ case TCKind._tk_abstract_interface:
+ case TCKind._tk_except:
+ if (id.length() != 0 || tc.id().length() != 0) {
+ return id.equals(tc.id());
+
+ } else if (name.length() != 0 || tc.name().length() != 0) {
+ if (!name.equals(tc.name()))
+ return false;
+ }
+ }
+
+ switch (kind.value()) {
+ case TCKind._tk_struct:
+ case TCKind._tk_union:
+ case TCKind._tk_value:
+ case TCKind._tk_except:
+ case TCKind._tk_enum:
+ if (memberNames.length != tc.member_count())
+ return false;
+
+ for (int i = 0; i < memberNames.length; i++) {
+ String name1 = memberNames[i];
+ String name2 = tc.member_name(i);
+
+ if (name1.length() != 0 || name2.length() != 0) {
+ if (!name1.equals(name2))
+ return false;
+ }
+ }
+ }
+
+
+ switch (kind.value()) {
+ case TCKind._tk_struct:
+ case TCKind._tk_union:
+ case TCKind._tk_value:
+ case TCKind._tk_except:
+ if (memberTypes.length != tc.member_count())
+ return false;
+
+ for (int i = 0; i < memberTypes.length; i++) {
+ TypeCodeImpl type1 = memberTypes[i];
+ TypeCode type2 = tc.member_type(i);
+
+ if (!type1.equal(type2, ctx))
+ return false;
+ }
+ }
+
+ if (kind.value() == TCKind._tk_union) {
+ if (labels.length != tc.member_count())
+ return false;
+
+ for (int i = 0; i < labels.length; i++) {
+
+ if (labels[i] instanceof AnyImpl) {
+
+ if (! ((AnyImpl) labels[i]).equal(tc.member_label(i), ctx))
+ return false;
+
+ } else {
+
+ if (! labels[i].equal(tc.member_label(i)))
+ return false;
+ }
+ }
+
+ if (! discriminatorType.equal(tc.discriminator_type(), ctx))
+ return false;
+ }
+
+ switch (kind.value()) {
+ case TCKind._tk_string:
+ case TCKind._tk_wstring:
+ case TCKind._tk_sequence:
+ case TCKind._tk_array:
+ if (length != tc.length())
+ return false;
+ }
+
+ switch (kind.value()) {
+ case TCKind._tk_sequence:
+ case TCKind._tk_array:
+ case TCKind._tk_value_box:
+ case TCKind._tk_alias:
+ if (!contentType.equal(tc.content_type()))
+ return false;
+ }
+
+ if (kind.value() == TCKind._tk_fixed) {
+ if (fixedScale != tc.fixed_scale()
+ || fixedDigits != tc.fixed_digits())
+ {
+ return false;
+ }
+ }
+
+ if (kind.value() == TCKind._tk_value) {
+ if (memberVisibility.length != tc.member_count())
+ return false;
+
+ for (int i = 0; i < memberVisibility.length; i++) {
+ if (memberVisibility[i] != tc.member_visibility(i)) {
+ return false;
+ }
+ }
+
+ if (typeModifier != tc.type_modifier())
+ return false;
+
+ if (concreteBaseType != null || tc.concrete_base_type() != null) {
+
+ if (concreteBaseType == null || tc.concrete_base_type() == null) {
+ return false;
+ }
+
+ if (!concreteBaseType.equal(tc.concrete_base_type()))
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ public TypeCode content_type()
+ throws BadKind
+ {
+ if (!(kind == org.omg.CORBA.TCKind.tk_sequence ||
+ kind == org.omg.CORBA.TCKind.tk_array ||
+ kind == org.omg.CORBA.TCKind.tk_value_box ||
+ kind == org.omg.CORBA.TCKind.tk_alias))
+ throw new BadKind();
+
+ return contentType;
+ }
+
+ public String name()
+ throws BadKind
+ {
+ return name;
+ }
+
+ public String id() {
+ // objref, struct, unionm enum, alias, value, valuebox, native,
+ // abstract_interface, except
+ return id;
+ }
+
+ public int member_count()
+ throws BadKind
+ {
+ return memberNames.length;
+ }
+
+ public String member_name(int idx)
+ throws BadKind, Bounds
+ {
+ // struct, union, value, except
+
+ try {
+ return memberNames[idx];
+ }
+ catch (ArrayIndexOutOfBoundsException ex) {
+ throw new Bounds();
+ }
+ }
+
+ public TypeCode member_type(int idx)
+ throws BadKind, Bounds
+ {
+ try {
+ return memberTypes[idx];
+ }
+ catch (ArrayIndexOutOfBoundsException ex) {
+ throw new Bounds();
+ }
+ }
+
+ public org.omg.CORBA.Any member_label(int idx)
+ throws BadKind, Bounds
+ {
+ if (kind != TCKind.tk_union)
+ throw new BadKind();
+
+ try {
+ return labels[idx];
+ }
+ catch (ArrayIndexOutOfBoundsException ex) {
+ throw new Bounds();
+ }
+ }
+
+ public org.omg.CORBA.TypeCode concrete_base_type()
+ throws BadKind
+ {
+ if (kind != TCKind.tk_value)
+ throw new BadKind();
+
+ return concreteBaseType;
+ }
+
+ public short type_modifier()
+ throws BadKind
+ {
+ if (kind != TCKind.tk_value)
+ throw new BadKind();
+
+ return typeModifier;
+ }
+
+ public short member_visibility(int index)
+ throws BadKind, Bounds
+ {
+ if (kind != TCKind.tk_value)
+ throw new BadKind();
+
+ if (index < 0 || index > memberVisibility.length)
+ throw new Bounds();
+
+ return memberVisibility[index];
+ }
+
+ public int length()
+ throws BadKind
+ {
+ return length;
+ }
+
+ public int default_index()
+ throws BadKind
+ {
+ if (kind != TCKind.tk_union)
+ throw new BadKind();
+
+ for (int i = 0; i < labels.length; i++) {
+ TypeCode tc = labels[i].type();
+ if (tc.kind() == TCKind.tk_octet)
+ return i;
+ }
+
+ return -1;
+ }
+
+ public TypeCode discriminator_type()
+ throws BadKind
+ {
+ if (kind != TCKind.tk_union)
+ throw new BadKind();
+
+ return discriminatorType;
+ }
+
+ public TCKind kind() {
+ return kind;
+ }
+
+ void __resolveRecursive() {
+ Map codes = new HashMap();
+ __resolveRecursive(codes);
+ }
+
+ private TypeCodeImpl __resolveRecursive(Map codes) {
+
+ if (recursiveId == null && id != null && !id.equals("")) {
+ codes.put(id, this);
+ }
+
+ if (memberTypes != null) {
+ for (int i = 0; i < memberTypes.length; i++)
+ memberTypes[i] = memberTypes[i].__resolveRecursive(codes);
+ }
+
+ if (labels != null) {
+ for (int i = 0; i < labels.length; i++) {
+ TypeCodeImpl tc = (TypeCodeImpl) labels[i].type();
+ if (tc != null)
+ labels[i].type(tc.__resolveRecursive(codes));
+ }
+ }
+
+ if (discriminatorType != null) {
+ discriminatorType = discriminatorType.__resolveRecursive(codes);
+ }
+
+ if (contentType != null) {
+ contentType = contentType.__resolveRecursive(codes);
+ }
+
+ if (concreteBaseType != null) {
+ concreteBaseType = concreteBaseType.__resolveRecursive(codes);
+ }
+
+ // now resolve...
+ if (recursiveId != null) {
+ TypeCodeImpl recursiveResolved = (TypeCodeImpl) codes.get(recursiveId);
+
+ if (recursiveResolved == null)
+ throw new org.omg.CORBA.BAD_TYPECODE
+ ("cannot resolve recursive typecode " + recursiveId);
+
+ return recursiveResolved;
+ } else {
+ return this;
+ }
+ }
+
+ public short fixed_digits()
+ throws BadKind
+ {
+ if (kind.value() != TCKind._tk_fixed) {
+ throw new BadKind();
+ }
+
+ return fixedDigits;
+ }
+
+ public short fixed_scale()
+ throws BadKind
+ {
+ if (kind.value() != TCKind._tk_fixed) {
+ throw new BadKind();
+ }
+
+ return fixedScale;
+ }
+
+ public String toString() {
+ switch (kind.value()) {
+ case TCKind._tk_null:
+ return "null";
+ case TCKind._tk_void:
+ return "void";
+ case TCKind._tk_short:
+ return "short";
+ case TCKind._tk_long:
+ return "long";
+ case TCKind._tk_longlong:
+ return "longlong";
+ case TCKind._tk_ushort:
+ return "ushort";
+ case TCKind._tk_ulong:
+ return "ulong";
+ case TCKind._tk_ulonglong:
+ return "ulonglong";
+ case TCKind._tk_float:
+ return "float";
+ case TCKind._tk_double:
+ return "double";
+ case TCKind._tk_longdouble:
+ return "longdouble";
+ case TCKind._tk_boolean:
+ return "boolean";
+ case TCKind._tk_char:
+ return "char";
+ case TCKind._tk_wchar:
+ return "wchar";
+ case TCKind._tk_octet:
+ return "octet";
+ case TCKind._tk_any:
+ return "any";
+ case TCKind._tk_TypeCode:
+ return "TypeCode";
+ case TCKind._tk_Principal:
+ return "Principal";
+ case TCKind._tk_fixed:
+ return "fixed{digits=" + fixedDigits + "; scale=" + fixedScale + "}";
+
+ case TCKind._tk_objref:
+ return "objref{id=" + id + "; name=" + name + "}";
+
+ case TCKind._tk_abstract_interface:
+ return "abstract_interface{id=" + id + "; name=" + name + "}";
+
+ case TCKind._tk_native:
+ return "native{id=" + id + "; name=" + name + "}";
+
+ case TCKind._tk_struct:
+ return "struct{id=" + id + "; name=" + name + "}";
+
+ case TCKind._tk_except:
+ return "except{id=" + id + "; name=" + name + "}";
+
+ case TCKind._tk_union:
+ return "union{id=" + id + "; name=" + name + "}";
+
+ case TCKind._tk_enum:
+ return "enum{id=" + id + "; name=" + name + "}";
+
+ case TCKind._tk_value:
+ return "value{id=" + id + "; name=" + name + "}";
+
+ case TCKind._tk_value_box:
+ return "valuebox{id=" + id + "; name=" + name + "}";
+
+ case TCKind._tk_string:
+ return "string{length=" + length + "}";
+
+ case TCKind._tk_wstring:
+ return "wstring{length=" + length + "}";
+
+ case TCKind._tk_sequence:
+ return "sequence{length=" + length + "; type" + contentType + "}";
+
+ case TCKind._tk_array:
+ return "array{length=" + length + "; type" + contentType + "}";
+
+ default:
+ throw new org.omg.CORBA.NO_IMPLEMENT();
+ }
+
+ }
+
+ public TypeCode get_compact_typecode() {
+ throw new org.omg.CORBA.NO_IMPLEMENT();
+ }
+
+ public boolean equivalent(TypeCode tc) {
+ return equals(tc);
+ }
+}
+
Added: geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/TypeCodeUtil.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/TypeCodeUtil.java?rev=329036&view=auto
==============================================================================
--- geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/TypeCodeUtil.java (added)
+++ geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/TypeCodeUtil.java Thu Oct 27 19:00:06 2005
@@ -0,0 +1,779 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * 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.apache.geronimo.corba;
+
+import org.omg.CORBA.StructMember;
+import org.omg.CORBA.TCKind;
+import org.omg.CORBA.TypeCode;
+import org.omg.CORBA.UnionMember;
+import org.omg.CORBA.VM_ABSTRACT;
+import org.omg.CORBA.ValueMember;
+
+import org.apache.geronimo.corba.io.EncapsulationInputStream;
+import org.apache.geronimo.corba.io.EncapsulationOutputStream;
+import org.apache.geronimo.corba.io.InputStreamBase;
+import org.apache.geronimo.corba.io.OutputStreamBase;
+
+
+public class TypeCodeUtil {
+
+ static TypeCodeImpl create_struct_tc(String id, String name,
+ StructMember[] members)
+ {
+ TypeCodeImpl tc = new TypeCodeImpl();
+ tc.kind = TCKind.tk_struct;
+ tc.id = id;
+ tc.name = name;
+
+ tc.memberNames = new String[members.length];
+ tc.memberTypes = new TypeCodeImpl[members.length];
+
+ for (int i = 0; i < members.length; i++) {
+ tc.memberNames[i] = members[i].name;
+ tc.memberTypes[i] = (TypeCodeImpl) members[i].type;
+ }
+
+ tc.__resolveRecursive();
+ return tc;
+ }
+
+ static TypeCodeImpl create_union_tc(String id, String name,
+ TypeCode discriminator_type, UnionMember[] members)
+ {
+ TypeCodeImpl tc = new TypeCodeImpl();
+ tc.kind = TCKind.tk_union;
+ tc.id = id;
+ tc.name = name;
+
+ tc.discriminatorType = (TypeCodeImpl) discriminator_type;
+
+ tc.memberNames = new String[members.length];
+ tc.memberTypes = new TypeCodeImpl[members.length];
+ tc.labels = new AnyImpl[members.length];
+
+ for (int i = 0; i < members.length; i++) {
+ tc.memberNames[i] = members[i].name;
+ tc.memberTypes[i] = (TypeCodeImpl) members[i].type;
+ tc.labels[i] = members[i].label;
+ }
+
+ tc.__resolveRecursive();
+ return tc;
+ }
+
+ static TypeCodeImpl create_enum_tc(String id, String name, String[] members) {
+ TypeCodeImpl tc = new TypeCodeImpl();
+
+ tc.kind = TCKind.tk_enum;
+ tc.id = id;
+ tc.name = name;
+ tc.memberNames = new String[members.length];
+ for (int i = 0; i < members.length; i++) {
+ tc.memberNames[i] = members[i];
+ }
+
+ return tc;
+ }
+
+ static TypeCodeImpl create_alias_tc(String id, String name,
+ TypeCode original_type)
+ {
+ TypeCodeImpl tc = new TypeCodeImpl();
+ tc.kind = TCKind.tk_alias;
+ tc.id = id;
+ tc.name = name;
+ tc.contentType = (TypeCodeImpl) original_type;
+ return tc;
+ }
+
+ static TypeCodeImpl create_exception_tc(String id, String name,
+ StructMember[] members)
+ {
+ TypeCodeImpl tc = new TypeCodeImpl();
+ tc.kind = TCKind.tk_except;
+ tc.id = id;
+ tc.name = name;
+
+ tc.memberNames = new String[members.length];
+ tc.memberTypes = new TypeCodeImpl[members.length];
+
+ for (int i = 0; i < members.length; i++) {
+ tc.memberNames[i] = members[i].name;
+ tc.memberTypes[i] = (TypeCodeImpl) members[i].type;
+ }
+
+ tc.__resolveRecursive();
+ return tc;
+ }
+
+ static TypeCodeImpl create_interface_tc(String id, String name) {
+ TypeCodeImpl tc = new TypeCodeImpl();
+ tc.kind = TCKind.tk_objref;
+ tc.id = id;
+ tc.name = name;
+ return tc;
+ }
+
+ static TypeCodeImpl create_string_tc(int bound) {
+ TypeCodeImpl tc = new TypeCodeImpl();
+ tc.kind = TCKind.tk_string;
+ tc.length = bound;
+ return tc;
+ }
+
+ static TypeCodeImpl create_wstring_tc(int bound) {
+ TypeCodeImpl tc = new TypeCodeImpl();
+ tc.kind = TCKind.tk_wstring;
+ tc.length = bound;
+ return tc;
+ }
+
+ static TypeCodeImpl create_fixed_tc(short digits, short scale) {
+ throw new org.omg.CORBA.NO_IMPLEMENT();
+ }
+
+ static TypeCodeImpl create_sequence_tc(int bound, TypeCode element_type) {
+ TypeCodeImpl tc = new TypeCodeImpl();
+ tc.kind = TCKind.tk_sequence;
+ tc.length = bound;
+ tc.contentType = (TypeCodeImpl) element_type;
+ return tc;
+ }
+
+ static TypeCodeImpl create_recursive_sequence_tc(int bound, int offset) {
+ throw new org.omg.CORBA.NO_IMPLEMENT("deprecated");
+ }
+
+ static TypeCodeImpl create_array_tc(int length, TypeCode element_type) {
+ throw new org.omg.CORBA.NO_IMPLEMENT();
+ }
+
+ static TypeCodeImpl create_value_tc(String id, String name,
+ short type_modifier, TypeCode concrete_base,
+ org.omg.CORBA.ValueMember[] members)
+ {
+ TypeCodeImpl tc = new TypeCodeImpl();
+ tc.kind = TCKind.tk_value;
+ tc.id = id;
+ tc.name = name;
+ tc.typeModifier = type_modifier;
+ tc.concreteBaseType = (TypeCodeImpl) concrete_base;
+ int count = members.length;
+ tc.memberNames = new String[count];
+ tc.memberTypes = new TypeCodeImpl[count];
+ tc.memberVisibility = new short[count];
+
+ for (int i = 0; i < count; i++) {
+ tc.memberNames[i] = members[i].name;
+ tc.memberTypes[i] = (TypeCodeImpl) members[i].type;
+ tc.memberVisibility[i] = members[i].access;
+ }
+
+ if (count > 0) {
+ tc.__resolveRecursive();
+ }
+
+ return tc;
+ }
+
+ static TypeCodeImpl create_value_box_tc(String id, String name,
+ TypeCode boxed_type)
+ {
+ TypeCodeImpl tc = new TypeCodeImpl();
+ tc.kind = TCKind.tk_value_box;
+ tc.id = id;
+ tc.name = name;
+ tc.contentType = (TypeCodeImpl) boxed_type;
+
+ return tc;
+ }
+
+ static TypeCodeImpl create_native_tc(String id, String name) {
+ throw new org.omg.CORBA.NO_IMPLEMENT();
+ }
+
+ static TypeCodeImpl create_recursive_tc(String id) {
+ TypeCodeImpl tc = new TypeCodeImpl();
+ tc.recursiveId = id;
+
+ return tc;
+ }
+
+ static TypeCodeImpl create_abstract_interface_tc(String id, String name) {
+ TypeCodeImpl tc = new TypeCodeImpl();
+ tc.kind = TCKind.tk_abstract_interface;
+
+ tc.id = id;
+ tc.name = name;
+
+ return tc;
+ }
+
+ static TypeCodeImpl[] primitives = new TypeCodeImpl[TCKind._tk_abstract_interface + 1];
+
+ static TypeCodeImpl get_primitive_tc(TCKind kind) {
+ int value = kind.value();
+
+ if (primitives[value] != null)
+ return primitives[value];
+
+ TypeCodeImpl tc = null;
+
+ switch (value) {
+ case TCKind._tk_null:
+ case TCKind._tk_void:
+ case TCKind._tk_short:
+ case TCKind._tk_long:
+ case TCKind._tk_ushort:
+ case TCKind._tk_ulong:
+ case TCKind._tk_float:
+ case TCKind._tk_double:
+ case TCKind._tk_boolean:
+ case TCKind._tk_char:
+ case TCKind._tk_octet:
+ case TCKind._tk_any:
+ case TCKind._tk_TypeCode:
+ case TCKind._tk_Principal:
+ case TCKind._tk_string:
+ case TCKind._tk_longlong:
+ case TCKind._tk_ulonglong:
+ case TCKind._tk_longdouble:
+ case TCKind._tk_wchar:
+ case TCKind._tk_wstring:
+ case TCKind._tk_fixed:
+ tc = new TypeCodeImpl();
+ tc.kind = kind;
+ break;
+
+ case TCKind._tk_objref:
+ tc = create_interface_tc("IDL:omg.org/CORBA/Object:1.0", "Object");
+ break;
+
+ case TCKind._tk_value:
+ tc = create_value_tc("IDL:omg.org/CORBA/ValueBase:1.0",
+ "ValueBase", VM_ABSTRACT.value, null, new ValueMember[0]);
+ break;
+
+ default:
+ throw new org.omg.CORBA.BAD_TYPECODE();
+ }
+
+ primitives[value] = tc;
+
+ return tc;
+ }
+
+ public static TypeCodeImpl read(InputStreamBase in,
+ InputStreamBase toplevel, java.util.Map map)
+ {
+ TypeCodeImpl tc;
+ int kind = in.read_ulong();
+ int pos = toplevel.__stream_position() - 4;
+ // boolean swap;
+
+ if (kind == -1) {
+ int offset = in.read_long();
+ int position = pos + 4 + offset;
+
+ position += (position & 3); // align ?
+
+ tc = (TypeCodeImpl) map.get(new Integer(position));
+ if (tc == null) {
+ throw new org.omg.CORBA.MARSHAL("invalid TypeCode indirection");
+ } else {
+ map.put(new Integer(pos), tc);
+ return tc;
+ }
+ }
+
+ EncapsulationInputStream encap_in;
+
+ switch (kind) {
+ case TCKind._tk_null:
+ case TCKind._tk_void:
+ case TCKind._tk_short:
+ case TCKind._tk_long:
+ case TCKind._tk_longlong:
+ case TCKind._tk_ushort:
+ case TCKind._tk_ulong:
+ case TCKind._tk_ulonglong:
+ case TCKind._tk_float:
+ case TCKind._tk_double:
+ case TCKind._tk_longdouble:
+ case TCKind._tk_boolean:
+ case TCKind._tk_char:
+ case TCKind._tk_wchar:
+ case TCKind._tk_octet:
+ case TCKind._tk_any:
+ case TCKind._tk_TypeCode:
+ case TCKind._tk_Principal:
+ tc = get_primitive_tc(TCKind.from_int(kind));
+ break;
+
+ case TCKind._tk_fixed:
+ tc = create_fixed_tc(in.read_ushort(), in.read_short());
+ break;
+
+ case TCKind._tk_objref:
+ encap_in = in.__open_encapsulation();
+ try {
+ tc = create_interface_tc(encap_in.read_string(), encap_in
+ .read_string());
+ }
+ finally {
+ in.__close_encapsulation(encap_in);
+ }
+ break;
+
+ case TCKind._tk_abstract_interface:
+ encap_in = in.__open_encapsulation();
+ try {
+ tc = create_abstract_interface_tc(encap_in.read_string(),
+ encap_in.read_string());
+ }
+ finally {
+ in.__close_encapsulation(encap_in);
+ }
+ in.__close_encapsulation(encap_in);
+ break;
+
+ case TCKind._tk_native:
+ encap_in = in.__open_encapsulation();
+ try {
+ tc = create_native_tc(encap_in.read_string(), encap_in
+ .read_string());
+ }
+ finally {
+ in.__close_encapsulation(encap_in);
+ }
+ break;
+
+ case TCKind._tk_struct:
+ case TCKind._tk_except: {
+ encap_in = in.__open_encapsulation();
+ try {
+
+ tc = new TypeCodeImpl();
+ map.put(new Integer(pos), tc);
+ tc.kind = TCKind.from_int(kind);
+ tc.id = encap_in.read_string();
+ tc.name = encap_in.read_string();
+ int count = encap_in.read_ulong();
+ tc.memberNames = new String[count];
+ tc.memberTypes = new TypeCodeImpl[count];
+ for (int i = 0; i < count; i++) {
+ tc.memberNames[i] = encap_in.read_string();
+ tc.memberTypes[i] = read(encap_in, toplevel, map);
+ }
+
+ }
+ finally {
+ in.__close_encapsulation(encap_in);
+ }
+
+ break;
+ }
+
+ case TCKind._tk_union: {
+ encap_in = in.__open_encapsulation();
+ try {
+
+ tc = new TypeCodeImpl();
+ map.put(new Integer(pos), tc);
+ tc.kind = TCKind.tk_union;
+ tc.id = encap_in.read_string();
+ tc.name = encap_in.read_string();
+ tc.discriminatorType = read(encap_in, toplevel, map);
+ int index = encap_in.read_long();
+ int count = encap_in.read_ulong();
+ tc.labels = new AnyImpl[count];
+ tc.memberNames = new String[count];
+ tc.memberTypes = new TypeCodeImpl[count];
+
+ for (int i = 0; i < count; i++) {
+ tc.labels[i] = new AnyImpl(encap_in.__orb());
+ if (i == index) {
+ AnyImpl scrap = new AnyImpl(encap_in.__orb());
+ scrap.read_value(encap_in, tc.discriminatorType);
+ tc.labels[i].insert_octet((byte) 0);
+ } else {
+ tc.labels[i].read_value(encap_in, tc.discriminatorType);
+ }
+
+ tc.memberNames[i] = encap_in.read_string();
+ tc.memberTypes[i] = read(encap_in, toplevel, map);
+ }
+
+ }
+ finally {
+ in.__close_encapsulation(encap_in);
+ }
+
+ break;
+ }
+
+ case TCKind._tk_enum: {
+ encap_in = in.__open_encapsulation();
+ try {
+ String id = encap_in.read_string();
+ String name = encap_in.read_string();
+ int count = encap_in.read_ulong();
+ String[] names = new String[count];
+ for (int i = 0; i < count; i++)
+ names[i] = encap_in.read_string();
+ tc = create_enum_tc(id, name, names);
+
+ }
+ finally {
+ in.__close_encapsulation(encap_in);
+ }
+
+ break;
+ }
+
+ case TCKind._tk_string:
+ tc = create_string_tc(in.read_ulong());
+ break;
+
+ case TCKind._tk_wstring:
+ tc = create_wstring_tc(in.read_ulong());
+ break;
+
+ case TCKind._tk_sequence:
+ case TCKind._tk_array:
+
+ encap_in = in.__open_encapsulation();
+ try {
+ tc = new TypeCodeImpl();
+ map.put(new Integer(pos), tc);
+
+ tc.kind = TCKind.from_int(kind);
+ tc.contentType = read(encap_in, toplevel, map);
+ tc.length = encap_in.read_ulong();
+ }
+ finally {
+ in.__close_encapsulation(encap_in);
+ }
+
+ break;
+
+ case TCKind._tk_alias:
+ encap_in = in.__open_encapsulation();
+ try {
+ tc = create_alias_tc(encap_in.read_string(), encap_in
+ .read_string(), read(encap_in, toplevel, map));
+ }
+ finally {
+ in.__close_encapsulation(encap_in);
+ }
+ // in.__swap (swap);
+ break;
+
+ case TCKind._tk_value:
+ encap_in = in.__open_encapsulation();
+ try {
+
+ tc = new TypeCodeImpl();
+ map.put(new Integer(pos), tc);
+ tc.kind = TCKind.tk_value;
+ tc.id = encap_in.read_string();
+ tc.name = encap_in.read_string();
+ tc.typeModifier = encap_in.read_short();
+ tc.concreteBaseType = read(encap_in, toplevel, map);
+ if (tc.concreteBaseType.kind() == TCKind.tk_null) {
+ tc.concreteBaseType = null;
+ }
+ int count = encap_in.read_ulong();
+ tc.memberNames = new String[count];
+ tc.memberTypes = new TypeCodeImpl[count];
+ tc.memberVisibility = new short[count];
+
+ for (int i = 0; i < count; i++) {
+ tc.memberNames[i] = encap_in.read_string();
+ tc.memberTypes[i] = read(encap_in, toplevel, map);
+ tc.memberVisibility[i] = encap_in.read_short();
+ }
+
+ }
+ finally {
+ in.__close_encapsulation(encap_in);
+ }
+
+ break;
+
+ case TCKind._tk_value_box:
+ encap_in = in.__open_encapsulation();
+ try {
+
+ tc = create_value_box_tc(encap_in.read_string(), encap_in
+ .read_string(), read(encap_in, toplevel, map));
+ }
+ finally {
+ in.__close_encapsulation(encap_in);
+ }
+
+ break;
+
+ default:
+ throw new org.omg.CORBA.NO_IMPLEMENT("read_TypeCode kind=" + kind
+ + "(" + Integer.toHexString(kind) + ")");
+ }
+
+ map.put(new Integer(pos), tc);
+ return tc;
+ }
+
+ static final int EMPTY_TC = 1;
+
+ static final int SIMPLE_TC = 2;
+
+ static final int COMPLEX_TC = 3;
+
+ static final int[] typecode_type = new int[]{EMPTY_TC, // null
+ EMPTY_TC, // void
+ EMPTY_TC, // short
+ EMPTY_TC, // long
+ EMPTY_TC, // ushort
+ EMPTY_TC, // ulong
+ EMPTY_TC, // float
+ EMPTY_TC, // double
+ EMPTY_TC, // boolean
+ EMPTY_TC, // char
+ EMPTY_TC, // octet
+ EMPTY_TC, // any
+ EMPTY_TC, // TypeCode
+ EMPTY_TC, // Principal
+
+ COMPLEX_TC, // objref
+ COMPLEX_TC, // struct
+ COMPLEX_TC, // union
+
+ COMPLEX_TC, // enum
+ SIMPLE_TC, // string
+ COMPLEX_TC, // sequence
+ COMPLEX_TC, // array
+ COMPLEX_TC, // alias
+ COMPLEX_TC, // except
+
+ EMPTY_TC, // longlong
+ EMPTY_TC, // ulonglong
+ EMPTY_TC, // longdouble
+ EMPTY_TC, // wchar
+
+ SIMPLE_TC, // wstring
+ SIMPLE_TC, // fixed
+ COMPLEX_TC, // value
+ COMPLEX_TC, // value_box
+
+ COMPLEX_TC, // abstract_interface
+ };
+
+ public static void write(OutputStreamBase out, TypeCode tc, java.util.Map map)
+ throws org.omg.CORBA.TypeCodePackage.BadKind,
+ org.omg.CORBA.TypeCodePackage.Bounds
+ {
+
+ EncapsulationOutputStream eout;
+ Integer pos = (Integer) map.get(tc);
+ if (pos != null) {
+ out.write_long(-1);
+ out.write_long(pos.intValue() - out.__stream_position());
+ } else {
+ org.omg.CORBA.TCKindHelper.write(out, tc.kind());
+ pos = new Integer(out.__stream_position() - 4);
+
+ switch (tc.kind().value()) {
+ case TCKind._tk_null:
+ case TCKind._tk_void:
+ case TCKind._tk_short:
+ case TCKind._tk_long:
+ case TCKind._tk_longlong:
+ case TCKind._tk_ushort:
+ case TCKind._tk_ulong:
+ case TCKind._tk_ulonglong:
+ case TCKind._tk_float:
+ case TCKind._tk_double:
+ case TCKind._tk_longdouble:
+ case TCKind._tk_boolean:
+ case TCKind._tk_char:
+ case TCKind._tk_wchar:
+ case TCKind._tk_octet:
+ case TCKind._tk_any:
+ case TCKind._tk_TypeCode:
+ case TCKind._tk_Principal:
+ break;
+
+ case TCKind._tk_fixed:
+ map.put(tc, pos);
+ out.write_ushort(tc.fixed_digits());
+ out.write_short(tc.fixed_scale());
+ break;
+
+ case TCKind._tk_objref:
+ case TCKind._tk_abstract_interface:
+ case TCKind._tk_native:
+ map.put(tc, pos);
+ eout = out.__open_encapsulation();
+ eout.write_string(tc.id());
+ eout.write_string(tc.name());
+ out.__close_encapsulation(eout);
+ break;
+
+ case TCKind._tk_struct:
+ case TCKind._tk_except:
+ map.put(tc, pos);
+ eout = out.__open_encapsulation();
+ eout.write_string(tc.id());
+ eout.write_string(tc.name());
+ eout.write_ulong(tc.member_count());
+ for (int i = 0; i < tc.member_count(); i++) {
+ eout.write_string(tc.member_name(i));
+ // recurse
+ write(eout, tc.member_type(i), map);
+ }
+ out.__close_encapsulation(eout);
+ break;
+
+ case TCKind._tk_union: {
+ map.put(tc, pos);
+ eout = out.__open_encapsulation();
+ eout.write_string(tc.id());
+ eout.write_string(tc.name());
+
+ // write discriminator
+ TypeCodeImpl disc = (TypeCodeImpl) tc.discriminator_type();
+ write(eout, disc, map);
+
+ int index = tc.default_index();
+ eout.write_long(index);
+ eout.write_ulong(tc.member_count());
+
+ for (int i = 0; i < tc.member_count(); i++) {
+
+ if (i == index) {
+ switch (disc.kind().value()) {
+ case TCKind._tk_short:
+ case TCKind._tk_ushort:
+ eout.write_short((short) 0);
+ break;
+
+ case TCKind._tk_long:
+ case TCKind._tk_ulong:
+ eout.write_long(0);
+ break;
+
+ case TCKind._tk_longlong:
+ case TCKind._tk_ulonglong:
+ eout.write_longlong(0);
+ break;
+
+ case TCKind._tk_boolean:
+ eout.write_boolean(false);
+ break;
+
+ case TCKind._tk_char:
+ eout.write_char((char) 0);
+ break;
+
+ case TCKind._tk_enum:
+ eout.write_ulong(0);
+ break;
+
+ default:
+ throw new org.omg.CORBA.BAD_TYPECODE();
+
+ }
+ } else {
+ tc.member_label(i).write_value(eout);
+ }
+
+ eout.write_string(tc.member_name(i));
+ write(eout, tc.member_type(i), map);
+ }
+
+ out.__close_encapsulation(eout);
+ break;
+ }
+
+ case TCKind._tk_enum:
+ map.put(tc, pos);
+ eout = out.__open_encapsulation();
+ eout.write_string(tc.id());
+ eout.write_string(tc.name());
+ eout.write_ulong(tc.member_count());
+ for (int i = 0; i < tc.member_count(); i++) {
+ eout.write_string(tc.member_name(i));
+ }
+ out.__close_encapsulation(eout);
+ break;
+
+ case TCKind._tk_string:
+ case TCKind._tk_wstring:
+ out.write_ulong(tc.length());
+ break;
+
+ case TCKind._tk_sequence:
+ case TCKind._tk_array:
+ map.put(tc, pos);
+ eout = out.__open_encapsulation();
+ write(out, tc.content_type(), map);
+ out.write_ulong(tc.length());
+ out.__close_encapsulation(eout);
+ break;
+
+ case TCKind._tk_value: {
+ map.put(tc, pos);
+
+ TypeCode base = tc.concrete_base_type();
+ if (base == null) {
+ base = get_primitive_tc(TCKind.tk_null);
+ }
+
+ eout = out.__open_encapsulation();
+
+ eout.write_string(tc.id());
+ eout.write_string(tc.name());
+ eout.write_short(tc.type_modifier());
+ write(eout, base, map);
+ eout.write_ulong(tc.member_count());
+ for (int i = 0; i < tc.member_count(); i++) {
+ eout.write_string(tc.member_name(i));
+ write(eout, tc.member_type(i), map);
+ eout.write_short(tc.member_visibility(i));
+ }
+ out.__close_encapsulation(eout);
+ break;
+ }
+
+ case TCKind._tk_value_box:
+ map.put(tc, pos);
+ eout = out.__open_encapsulation();
+
+ eout.write_string(tc.id());
+ eout.write_string(tc.name());
+
+ write(eout, tc.content_type(), map);
+
+ out.__close_encapsulation(eout);
+ break;
+
+ default:
+ throw new org.omg.CORBA.NO_IMPLEMENT();
+ }
+ }
+ }
+}
Added: geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/cdr/ByteBufferReader.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/cdr/ByteBufferReader.java?rev=329036&view=auto
==============================================================================
--- geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/cdr/ByteBufferReader.java (added)
+++ geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/cdr/ByteBufferReader.java Thu Oct 27 19:00:06 2005
@@ -0,0 +1,91 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * 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.apache.geronimo.corba.cdr;
+
+import java.nio.ByteBuffer;
+
+import EDU.oswego.cs.dl.util.concurrent.Semaphore;
+
+
+public class ByteBufferReader {
+
+ Semaphore full;
+
+ Semaphore empty;
+
+ int readpos;
+
+ int writepos;
+
+ ByteBuffer storage;
+
+ ByteBufferReader(ByteBuffer buf) {
+ storage = buf;
+ full = new Semaphore(buf.remaining());
+ empty = new Semaphore(0);
+ }
+
+ void readSome() {
+ int howmuch = (int) full.permits();
+ int howmany = acquire(full, Math.min(howmuch, 1));
+
+ if (readpos < writepos) {
+
+ int first_write = Math.min(howmany, storage.limit() - writepos);
+
+ storage.position(writepos);
+ storage.limit(writepos + first_write);
+
+ ByteBuffer buf1 = storage.slice();
+
+ storage.position(0);
+
+ int howmuchread;
+ if (first_write == howmany) {
+ storage.limit(storage.capacity());
+ howmuchread = single_read(buf1);
+ } else {
+ int second_write = howmany - first_write;
+ storage.limit(second_write);
+ ByteBuffer buf2 = storage.slice();
+ howmuchread = vector_read(buf1, buf2);
+ }
+
+ if (howmuchread < howmany) {
+ full.release(howmany - howmuchread);
+ }
+ empty.release(howmuchread);
+
+ writepos = (writepos + howmuchread) % storage.capacity();
+
+ }
+ }
+
+ private int acquire(Semaphore sem, int howmany) {
+ for (int l = 0; l < howmany; l++) {
+ try {
+ sem.acquire();
+ }
+ catch (InterruptedException ex) {
+ return l;
+ }
+ }
+
+ return howmany;
+ }
+
+}
Added: geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/cdr/CDRInputStream.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/cdr/CDRInputStream.java?rev=329036&view=auto
==============================================================================
--- geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/cdr/CDRInputStream.java (added)
+++ geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/cdr/CDRInputStream.java Thu Oct 27 19:00:06 2005
@@ -0,0 +1,109 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * 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.apache.geronimo.corba.cdr;
+
+import java.nio.ByteBuffer;
+
+import org.omg.CORBA_2_3.portable.InputStream;
+
+import org.apache.geronimo.corba.AbstractORB;
+import org.apache.geronimo.corba.ORB;
+import org.apache.geronimo.corba.io.GIOPVersion;
+
+
+public abstract class CDRInputStream extends InputStream {
+
+ private ByteBuffer buf;
+
+ private GIOPVersion giop_version;
+
+ private ORB orb;
+
+ public CDRInputStream(ORB orb, ByteBuffer buf, GIOPVersion version,
+ InputStreamController ctrl)
+ {
+ this.giop_version = version;
+ this.orb = orb;
+ this.buf = buf;
+ }
+
+ protected final int computeAlignment(int align) {
+ if (align > 1) {
+ int incr = buf.position() & (align - 1);
+ if (incr != 0)
+ return align - incr;
+ }
+
+ return 0;
+ }
+
+ public int getSize() {
+ return buf.position();
+ }
+
+ void alignAndCheck(int size, int align) {
+ int a = computeAlignment(align);
+ buf.position(buf.position() + a);
+
+ if (buf.remaining() < size) {
+ grow(size);
+ }
+ }
+
+ public int read_long() {
+ alignAndCheck(4, 4);
+ return buf.getInt();
+ }
+
+ public void __readEndian() {
+ // TODO Auto-generated method stub
+
+ }
+
+ /**
+ * Create an inputstream that reads data from the given byte array
+ */
+ public static CDRInputStream create(byte[] data) {
+ return create(ByteBuffer.wrap(data));
+ }
+
+ public static CDRInputStream create(ByteBuffer buf) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public int __get_input_position() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public long __beginEncapsulation() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public void __endEncapsulation(long encap_state) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public AbstractORB __get_orb() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
Added: geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/cdr/CDROutputStream.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/cdr/CDROutputStream.java?rev=329036&view=auto
==============================================================================
--- geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/cdr/CDROutputStream.java (added)
+++ geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/cdr/CDROutputStream.java Thu Oct 27 19:00:06 2005
@@ -0,0 +1,53 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * 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.apache.geronimo.corba.cdr;
+
+import org.omg.CORBA_2_3.portable.OutputStream;
+
+
+public abstract class CDROutputStream extends OutputStream {
+
+ public void __writeEndian() {
+ // TODO Auto-generated method stub
+
+ }
+
+ /**
+ * Allocate a dynamic in-memory output stream
+ */
+ public static CDROutputStream create() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /** */
+ public int __get_output_position() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public long __beginEncapsulation() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public void __finishEncapsulation(long encap_state) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
Added: geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/cdr/InputStreamController.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/cdr/InputStreamController.java?rev=329036&view=auto
==============================================================================
--- geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/cdr/InputStreamController.java (added)
+++ geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/cdr/InputStreamController.java Thu Oct 27 19:00:06 2005
@@ -0,0 +1,22 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * 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.apache.geronimo.corba.cdr;
+
+public interface InputStreamController {
+
+ void underrun();
+}
Added: geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/BufferedOutputChannel.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/BufferedOutputChannel.java?rev=329036&view=auto
==============================================================================
--- geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/BufferedOutputChannel.java (added)
+++ geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/BufferedOutputChannel.java Thu Oct 27 19:00:06 2005
@@ -0,0 +1,64 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * 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.apache.geronimo.corba.channel;
+
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+
+public class BufferedOutputChannel extends OutputChannel {
+
+ ByteArrayOutputStream bao = new ByteArrayOutputStream();
+ DataOutputStream dout = new DataOutputStream(bao);
+
+ public void writeByte(byte b) throws IOException {
+ dout.writeByte(b);
+ }
+
+ public void writeInt(int i) throws IOException {
+ dout.writeInt(i);
+ }
+
+ public void writeLong(long l) throws IOException {
+ dout.writeLong(l);
+ }
+
+ public void skip(int count) throws IOException {
+ for (int i = 0; i < count; i++) {
+ dout.write(0);
+ }
+ }
+
+ public OutputChannelMarker mark(MarkHandler handler) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public void writeTo(OutputChannel ch) throws IOException {
+ bao.writeTo(ch);
+ }
+
+ public void relinquish() {
+ // do nothing //
+ }
+
+ public void writeShort(short s) throws IOException {
+ dout.writeShort(s);
+ }
+
+}
Added: geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/ChannelClosedException.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/ChannelClosedException.java?rev=329036&view=auto
==============================================================================
--- geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/ChannelClosedException.java (added)
+++ geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/ChannelClosedException.java Thu Oct 27 19:00:06 2005
@@ -0,0 +1,37 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * 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.apache.geronimo.corba.channel;
+
+import java.io.IOException;
+
+
+/**
+ * issed in response to a write into an OutputChannel which has been closed
+ */
+public class ChannelClosedException extends IOException {
+
+ public ChannelClosedException() {
+ super();
+ // TODO Auto-generated constructor stub
+ }
+
+ public ChannelClosedException(String s) {
+ super(s);
+ // TODO Auto-generated constructor stub
+ }
+
+}
Added: geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/FilterInputChannel.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/FilterInputChannel.java?rev=329036&view=auto
==============================================================================
--- geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/FilterInputChannel.java (added)
+++ geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/FilterInputChannel.java Thu Oct 27 19:00:06 2005
@@ -0,0 +1,67 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * 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.apache.geronimo.corba.channel;
+
+import java.io.IOException;
+import java.nio.ByteOrder;
+
+
+public class FilterInputChannel extends InputChannel {
+
+ protected final InputChannel ch;
+
+ FilterInputChannel(InputChannel ch) {
+ this.ch = ch;
+ }
+
+ public byte readByte() throws IOException {
+ return ch.readByte();
+ }
+
+ public int readInt() throws IOException {
+ return ch.readInt();
+ }
+
+ public long readLong() throws IOException {
+ return ch.readLong();
+ }
+
+ public void skip(int count) throws IOException {
+ ch.skip(count);
+ }
+
+ public boolean isClosed() {
+ return ch.isClosed();
+ }
+
+ public int read(byte[] data, int off, int len) throws IOException {
+ return ch.read(data, off, len);
+ }
+
+ public short readShort() throws IOException {
+ return ch.readShort();
+ }
+
+ public void setOrder(ByteOrder order) {
+ ch.setOrder(order);
+ }
+
+ public void relinquish() {
+ ch.relinquish();
+ }
+
+}
Added: geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/FilterOutputChannel.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/FilterOutputChannel.java?rev=329036&view=auto
==============================================================================
--- geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/FilterOutputChannel.java (added)
+++ geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/FilterOutputChannel.java Thu Oct 27 19:00:06 2005
@@ -0,0 +1,62 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * 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.apache.geronimo.corba.channel;
+
+import java.io.IOException;
+
+
+public class FilterOutputChannel extends OutputChannel {
+
+ final protected OutputChannel ch;
+
+ protected FilterOutputChannel(OutputChannel ch) {
+ this.ch = ch;
+ }
+
+ public void writeByte(byte b) throws IOException {
+ ch.writeByte(b);
+ }
+
+ public void writeInt(int i) throws IOException {
+ ch.writeInt(i);
+ }
+
+ public void writeShort(short s) throws IOException {
+ ch.writeShort(s);
+ }
+
+ public void writeLong(long l) throws IOException {
+ ch.writeLong(l);
+ }
+
+ public void skip(int count) throws IOException {
+ ch.skip(count);
+ }
+
+ public OutputChannelMarker mark(MarkHandler handler) {
+ return ch.mark(handler);
+ }
+
+ public void write(byte[] b, int off, int len) throws IOException {
+ ch.write(b, off, len);
+ }
+
+ public void relinquish() {
+ ch.relinquish();
+ }
+
+}
Added: geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/IOSemaphore.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/IOSemaphore.java?rev=329036&view=auto
==============================================================================
--- geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/IOSemaphore.java (added)
+++ geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/IOSemaphore.java Thu Oct 27 19:00:06 2005
@@ -0,0 +1,177 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * 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.apache.geronimo.corba.channel;
+
+import org.apache.geronimo.corba.concurrency.IOSemaphoreClosedException;
+
+
+/**
+ * An IOSemaphore is used for buffered IO.
+ * <p/>
+ * The special feature of the IOSemaphore is that it can be "closed,"
+ * after which no more permits can be released. When an IOSemaphore is
+ * closed, existing permits can be acquired. Successive attempts
+ * to acquire more permits yields an IOSemaphoreClosedException.
+ */
+
+public class IOSemaphore {
+
+ private int permits;
+
+ private boolean isClosed;
+
+ public IOSemaphore(int permits) {
+ super();
+ this.permits = permits;
+ }
+
+ public synchronized boolean isClosed() {
+ return isClosed;
+ }
+
+ public void acquire() throws IOSemaphoreClosedException {
+ acquire(1);
+ }
+
+ /**
+ * acquire at least one, and maximum <code>max</code> permits.
+ *
+ * @param max
+ * @return
+ * @throws IOSemaphoreClosedException
+ * @throws IOSemaphoreClosedException
+ */
+
+ public int acquireSome(int max) throws IOSemaphoreClosedException {
+ return acquireSome(1, max, 0);
+ }
+
+ public synchronized int acquireSome(int min, int max, long time) throws IOSemaphoreClosedException {
+
+ // the fast track //
+ if (permits >= 1) {
+ int howmany = Math.min(permits, max);
+ permits -= howmany;
+ return howmany;
+ }
+
+ long now = System.currentTimeMillis();
+
+ long end;
+ if (time == 0) {
+ end = Long.MAX_VALUE;
+ } else {
+ end = now + Math.min(time, Long.MAX_VALUE - now);
+ }
+
+ while (permits < min) {
+ if (isClosed) {
+ throw new IOSemaphoreClosedException(permits);
+ }
+
+ now = System.currentTimeMillis();
+ long rest = end - now;
+ try {
+ wait(rest);
+ }
+ catch (InterruptedException e) {
+ // clear interrupted flag
+ Thread.interrupted();
+
+ }
+
+ }
+
+ int howmany = Math.min(permits, max);
+ permits -= howmany;
+ return howmany;
+ }
+
+ public void acquire(int i) throws IOSemaphoreClosedException {
+ attempt(i, 0L);
+ }
+
+ public synchronized boolean attempt(int i, long time)
+ throws IOSemaphoreClosedException
+ {
+
+ // the fast track //
+ if (permits >= i) {
+ permits -= i;
+ return true;
+ }
+
+ long now = System.currentTimeMillis();
+
+ long end;
+ if (time == 0) {
+ end = Long.MAX_VALUE;
+ } else {
+ end = now + Math.min(time, Long.MAX_VALUE - now);
+ }
+
+ while (permits < i) {
+ if (isClosed) {
+ throw new IOSemaphoreClosedException(permits);
+ }
+
+ now = System.currentTimeMillis();
+ long rest = end - now;
+ try {
+ wait(rest);
+ }
+ catch (InterruptedException e) {
+ // clear interrupted flag
+ Thread.interrupted();
+
+ }
+
+ }
+ permits -= i;
+
+ return true;
+ }
+
+ public void release() throws IOSemaphoreClosedException {
+ release(1);
+ }
+
+ public synchronized void release(int i) throws IOSemaphoreClosedException {
+ if (isClosed) {
+ throw new IOSemaphoreClosedException(permits);
+ }
+
+ permits += i;
+ notifyAll();
+ }
+
+ public synchronized void close() {
+ isClosed = true;
+ notifyAll();
+ }
+
+ public synchronized int availablePermits() {
+ return permits;
+ }
+
+ public synchronized void releaseIfNotClosed(int amount) {
+ if (!isClosed) {
+ permits += amount;
+ notifyAll();
+ }
+ }
+}
Added: geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/InputChannel.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/InputChannel.java?rev=329036&view=auto
==============================================================================
--- geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/InputChannel.java (added)
+++ geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/InputChannel.java Thu Oct 27 19:00:06 2005
@@ -0,0 +1,52 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * 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.apache.geronimo.corba.channel;
+
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteOrder;
+
+
+public abstract class InputChannel extends InputStream {
+
+ public abstract byte readByte() throws IOException;
+
+ public abstract short readShort() throws IOException;
+
+ public abstract int readInt() throws IOException;
+
+ public abstract long readLong() throws IOException;
+
+ public abstract void skip(int count) throws IOException;
+
+ public int read() throws IOException {
+ try {
+ return readByte();
+ }
+ catch (EOFException ex) {
+ return -1;
+ }
+ }
+
+ public abstract boolean isClosed();
+
+ public abstract void relinquish();
+
+ public abstract void setOrder(ByteOrder order);
+
+}
Added: geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/InputHandler.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/InputHandler.java?rev=329036&view=auto
==============================================================================
--- geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/InputHandler.java (added)
+++ geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/InputHandler.java Thu Oct 27 19:00:06 2005
@@ -0,0 +1,27 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * 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.apache.geronimo.corba.channel;
+
+
+public interface InputHandler {
+
+ /**
+ * Input is available
+ */
+ void inputAvailable(Transport transport);
+
+}
Added: geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/MarkHandler.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/MarkHandler.java?rev=329036&view=auto
==============================================================================
--- geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/MarkHandler.java (added)
+++ geronimo/trunk/sandbox/freeorb/geronimo-orb/src/main/java/org/apache/geronimo/corba/channel/MarkHandler.java Thu Oct 27 19:00:06 2005
@@ -0,0 +1,26 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * 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.apache.geronimo.corba.channel;
+
+import java.io.IOException;
+
+
+public interface MarkHandler {
+
+ void bufferFull(OutputChannelMarker state) throws IOException;
+
+}