You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by ro...@apache.org on 2007/07/13 20:26:31 UTC

svn commit: r556089 [9/11] - in /incubator/tuscany/cpp/sca: VSExpress/tuscany_sca/tuscany_sca_cpp/ doc/ runtime/extensions/cpp/ runtime/extensions/cpp/tools/ runtime/extensions/cpp/tools/scagen/ runtime/extensions/cpp/tools/scagen/META-INF/ runtime/ext...

Added: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Parameter.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Parameter.java?view=auto&rev=556089
==============================================================================
--- incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Parameter.java (added)
+++ incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Parameter.java Fri Jul 13 11:26:14 2007
@@ -0,0 +1,216 @@
+/**
+ *
+ *  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.
+ */
+
+/* @version $Rev$ $Date$ */
+
+/*
+ *  Branched from the original class that was also contributed to the 
+ *  org.apache.axis.tools.common package.
+ *  
+ */
+package org.apache.tuscany.sca.cpp.tools.common;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * A parameter from a method signature. The parameter is the datatype plus its
+ * name but not its value.
+ */
+public class Parameter {
+    private ArrayList type = new ArrayList();
+
+    private String name = null;
+
+    private boolean failed = false;
+
+    /**
+     * Defaults to a parameter in a parameter list so it HAS a parameter name in
+     * it
+     */
+    Parameter(List parts) {
+        this(parts, false);
+    }
+
+    /**
+     * A parameter which is a return type does not have a parameter name.
+     * Parameters in a parameter list do have parameter names embedded in them
+     */
+    Parameter(List parts, boolean isRetType) {
+        if (parts == null || parts.size() == 0)
+            return;
+
+        // Tuscany: The original code below from apache axis blocks int
+        // getCustomer(long)
+        // i.e. no spaces in parameter list.
+        // We do not need to deal with "..." as parameters to SCS methods.
+        // 
+        //        if (!isRetType && parts.size() == 1) {
+        //            if ("...".equals(parts.get(0))) {
+        //                type.add("...");
+        //                name = "";
+        //            } else if (!"void".equals(parts.get(0)))
+        //                failed = true; // Seems like bad C++ code here
+        //            return;
+        //        }
+
+        if (isRetType) {
+            Iterator it = parts.iterator();
+            while (it.hasNext())
+                type.add(it.next());
+
+            // Some methods return have void on their signature and others
+            // have nothing. So to make them both the same, if a method
+            // doesn't return anything make type null.
+            // TODO: This assumption is wrong - methods that return nothing
+            // default to returning an int!
+            if (1 == type.size() && "void".equals(type.get(0)))
+                type = new ArrayList();
+
+        } else {
+            // Cope with array subscripts [] after the name
+            int arrIdx = -1;
+            for (int i = 0; i < parts.size(); i++) {
+                String tok = (String) parts.get(i);
+                if ("[".equals(tok)) {
+                    arrIdx = i;
+                    break;
+                }
+            }
+
+            // Find the name
+            int nameIdx = parts.size() - 1;
+            if (-1 != arrIdx)
+                nameIdx = arrIdx - 1;
+
+            // Even in real method declarations, parameters may not have a name
+            boolean noName = false;
+            name = (String) parts.get(nameIdx);
+            // Tuscany: The original code below from apache axis
+            // was updated to work with signatures of
+            // the form fn(int) a non-named, no-space, parameter list.
+            // if (Utils.cPrimitives.contains(name) ||
+            // Utils.cTypeQualifiers.contains(name) )
+            //
+            if (Utils.cPrimitives.contains(name)
+                    || Utils.cTypeQualifiers.contains(name)
+                    || parts.size() == 1)
+                noName = true;
+
+            if (noName) {
+                name = null;
+                for (int i = 0; i < parts.size(); i++)
+                    type.add(parts.get(i));
+            } else {
+                // Construct the type
+                for (int i = 0; i < nameIdx; i++)
+                    type.add(parts.get(i));
+
+                if (-1 != arrIdx)
+                    for (int i = arrIdx; i < parts.size(); i++)
+                        type.add(parts.get(i));
+            }
+        }
+    }
+
+    public boolean failed() {
+        return failed;
+    }
+
+    public String getType() {
+        String s = null;
+        Iterator it = type.iterator();
+        while (it.hasNext()) {
+            String next = (String) it.next();
+            if (null == s)
+                s = next;
+            else if ("*".equals(next) || "&".equals(next))
+                s += next;
+            else
+                s += " " + next;
+        }
+        return s;
+    }
+
+    public String getTypeWithoutConst() {
+        String s = null;
+        Iterator it = type.iterator();
+        while (it.hasNext()) {
+            String next = (String) it.next();
+            if ("const".equals(next))
+                continue;
+            else if (null == s)
+                s = next;
+            else if ("*".equals(next) || "&".equals(next))
+                s += next;
+            else
+                s += " " + next;
+        }
+        return s;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public boolean isVoid() {
+        return 0 == type.size();
+    }
+
+    public boolean isDotDotDot() {
+        return 1 == type.size() && "...".equals(type.get(0));
+    }
+
+    /**
+     * For two parameters to match their types must match or both be null, but
+     * the parameters names don't have to match. Just because a parameter is
+     * called something different in a header file as in the the source file
+     * doesn't mean it's a different parameter.
+     */
+    public boolean equals(Object o) {
+        if (null == o || !(o instanceof Parameter))
+            return false;
+        Parameter that = (Parameter) o;
+        if (type.size() != that.type.size())
+            return false;
+        for (int i = 0; i < type.size(); i++) {
+            String s1 = (String) type.get(i);
+            String s2 = (String) that.type.get(i);
+            if (!Utils.safeEquals(s1, s2))
+                return false;
+        }
+        return true;
+    }
+
+    public String toString() {
+        if (0 == type.size())
+            return "void";
+        if (null == name)
+            return getType();
+        return getType() + " " + name;
+    }
+
+    public Iterator iterator() {
+        if (null == type)
+            return null;
+        return type.iterator();
+    }
+}
\ No newline at end of file

Propchange: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Parameter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Parameter.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/ParsingException.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/ParsingException.java?view=auto&rev=556089
==============================================================================
--- incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/ParsingException.java (added)
+++ incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/ParsingException.java Fri Jul 13 11:26:14 2007
@@ -0,0 +1,48 @@
+/**
+ *
+ *  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.
+ */
+
+/* @version $Rev$ $Date$ */
+
+
+/*
+ * Branched from the original class that was also contributed to the
+ * org.apache.axis.tools.common package.
+ *  
+ */
+package org.apache.tuscany.sca.cpp.tools.common;
+
+public class ParsingException extends Exception {
+
+    public ParsingException() {
+        super();
+    }
+
+    public ParsingException(String message) {
+        super(message);
+    }
+
+    public ParsingException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public ParsingException(Throwable cause) {
+        super(cause);
+    }
+}
\ No newline at end of file

Propchange: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/ParsingException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/ParsingException.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/PrototypePart.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/PrototypePart.java?view=auto&rev=556089
==============================================================================
--- incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/PrototypePart.java (added)
+++ incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/PrototypePart.java Fri Jul 13 11:26:14 2007
@@ -0,0 +1,56 @@
+/**
+ *
+ *  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.
+ */
+
+/* @version $Rev$ $Date$ */
+
+/*
+ *  Branched from the original class that was also contributed to the 
+ *  org.apache.axis.tools.common package.
+ *  
+ */
+package org.apache.tuscany.sca.cpp.tools.common;
+
+/**
+ * A function prototype in an include file and possibly in a class definition.
+ */
+public class PrototypePart extends FilePart {
+    private Signature signature;
+
+    public PrototypePart(String s, String className, String namespace) {
+        super(s, PROTOTYPE);
+        signature = new Signature(s);
+        if (null != className)
+            signature.setClassName(className);
+        if (null != namespace && namespace.length()>0)
+            signature.setNamespace(namespace);
+    }
+
+    String className() {
+        return signature.getClassName();
+    }
+
+    public Signature getSignature() {
+        return signature;
+    }
+
+    public void setScope(String scope) {
+        signature.setScope(scope);
+    }
+}
\ No newline at end of file

Propchange: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/PrototypePart.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/PrototypePart.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Signature.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Signature.java?view=auto&rev=556089
==============================================================================
--- incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Signature.java (added)
+++ incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Signature.java Fri Jul 13 11:26:14 2007
@@ -0,0 +1,506 @@
+/**
+ *
+ *  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.
+ */
+
+/* @version $Rev$ $Date$ */
+
+/*
+ *  Branched from the original class that was also contributed to the 
+ *  org.apache.axis.tools.common package.
+ *  
+ */
+package org.apache.tuscany.sca.cpp.tools.common;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * A C or C++ method signature with the ability to parse it. TODO: properly
+ * support variable length argument lists using "..." TODO: passing or returning
+ * function pointers (hopefully not needed) TODO: Cope with ~ <space>Classname()
+ */
+public class Signature {
+    private String originalText;
+
+    private String attributes;
+
+    private String className = null;
+    
+    private String namespace = null;
+
+    private String methodName = null;
+
+    private Parameter returnType = null;
+
+    private Parameter[] params = null;
+
+    private String trailingAttributes;
+
+    private String scope = "public";
+
+    private boolean failed = false;
+
+    private boolean traceable = true;
+
+    private final static Set knownAttrs = new HashSet(Arrays
+            .asList(new Object[] { "public", "private", "extern", "\"C\"",
+                    "virtual", "static", "inline" }));
+
+    private final static Set specialOperators = new HashSet(
+            Arrays.asList(new Object[] { "(", ")", "*", ",", "&", "]", "[",
+                    "=", "~" }));
+
+    /**
+     * Takes an unparsed signature string and parses it.
+     * 
+     * TODO: Should optionally pass in the className here in case it's an inline
+     * method implementation inside the class{}. Just so the className comes out
+     * in the trace.
+     */
+    Signature(String s) {
+        originalText = s;
+
+        try {
+            List tokens = tokenise(s);
+
+            ArrayList alAttrs = new ArrayList();
+            ArrayList alName = new ArrayList();
+            ArrayList alParms = new ArrayList();
+            ArrayList alTrailAttrs = new ArrayList();
+            ArrayList alInits = new ArrayList();
+            if (!splitUp(tokens, alAttrs, alName, alParms, alTrailAttrs,
+                    alInits)) {
+                failed = true;
+                return;
+            }
+
+            parseAttributes(alAttrs);
+            parseNameAndRetType(alName);
+            parseParameters(alParms);
+            parseTrailingAttributes(alTrailAttrs);
+
+            // Ignore any tokens after the ) since these are (hopefully)
+            // constructor initialisers
+
+            traceable = !Configuration.methodExcluded(className, methodName);
+        } catch (NullPointerException npe) {
+            failed = true;
+            traceable = false;
+        }
+    }
+
+    /**
+     * Parse the signature into tokens. This removes whitespace and comments and
+     * separates out "*", ",", "(", ")", "&", "[" and "]".
+     */
+    private static List tokenise(String s) {
+        ArrayList tokens = new ArrayList();
+        String tok = null;
+        boolean space = true;
+        for (int i = 0; i < s.length(); i++) {
+            char c = s.charAt(i);
+            if (Character.isWhitespace(c)) {
+                space = true;
+                continue;
+            }
+            if (space) {
+                if (tok != null)
+                    tokens.add(tok);
+                tok = "" + c;
+            } else
+                tok += c;
+            space = false;
+
+            if (tok.endsWith("/*")) {
+                String sub = s.substring(i);
+                int endcomm = sub.indexOf("*/");
+                if (endcomm == -1)
+                    break;
+                i += endcomm + 1;
+                if (tok.equals("/*"))
+                    tok = "";
+                else
+                    tok = tok.substring(0, tok.length() - 2);
+                continue;
+            }
+
+            if (tok.endsWith("//")) {
+                String sub = s.substring(i);
+                int endcomm = sub.indexOf("\n");
+                if (endcomm == -1)
+                    break;
+                i += endcomm;
+                if (tok.equals("//"))
+                    tok = "";
+                else
+                    tok = tok.substring(0, tok.length() - 1);
+                continue;
+            }
+
+            if (tok.endsWith("::"))
+                space = true;
+
+            String sc = "" + c;
+            if (specialOperators.contains(sc)) {
+                if (!tok.equals(sc)) {
+                    tokens.add(tok.substring(0, tok.length() - 1));
+                    tok = sc;
+                }
+                space = true;
+            }
+        }
+        tokens.add(tok);
+        return tokens;
+    }
+
+    /**
+     * Split up a tokenised method signature into a list of attributes, a list
+     * of name and return type tokens, a list of parameter tokens and a list of
+     * initialiser tokens.
+     */
+    private static boolean splitUp(List tokens, List attrs, List nameAndRet,
+            List parms, List trailAttrs, List inits) {
+
+        // nameStart points to the start of the return type if there is one
+        // else the start of the method name
+        int nameStart;
+        for (nameStart = 0; nameStart < tokens.size(); nameStart++) {
+            String tok = (String) (tokens.get(nameStart));
+            if (!knownAttrs.contains(tok) && !Configuration.isAttribute(tok))
+                break;
+        }
+        if (nameStart == tokens.size())
+            return false;
+
+        // initStart points to the initialisers, or thrown exceptions after
+        // the parameter list. throw is a keyword so we can safely search for
+        // it.
+        int initStart = tokens.size();
+        for (int i = nameStart; i < tokens.size(); i++) {
+            String tok = (String) tokens.get(i);
+            if ((tok.startsWith(":") && !tok.startsWith("::"))
+                    || "throw".equals(tok))
+                initStart = i;
+        }
+
+        int parmEnd;
+        for (parmEnd = initStart - 1; parmEnd > nameStart; parmEnd--)
+            if (")".equals(tokens.get(parmEnd)))
+                break;
+        if (parmEnd == nameStart)
+            return false;
+
+        int parmStart = parmEnd;
+        for (parmStart = parmEnd; parmStart > nameStart; parmStart--)
+            if ("(".equals(tokens.get(parmStart)))
+                break;
+
+        for (int i = 0; i < tokens.size(); i++) {
+            Object tok = tokens.get(i);
+            if (i < nameStart || Configuration.isAttribute((String) tok))
+                attrs.add(tok);
+            else if (i < parmStart)
+                nameAndRet.add(tok);
+            else if (i <= parmEnd)
+                parms.add(tok);
+            else if (i < initStart)
+                trailAttrs.add(tok);
+            else
+                inits.add(tok);
+        }
+        return true;
+    }
+
+    private void parseAttributes(List list) {
+        attributes = new String();
+        Iterator it = list.iterator();
+        while (it.hasNext()) {
+            if (attributes.length() > 0)
+                attributes += " ";
+            String next = (String) it.next();
+            
+            //Tuscancy 
+            //the scope is not present in the attributes
+            //but is set later in the InputCppSource contructor
+            if ("public".equals(next) || "protected".equals(next)
+                    || "private".equals(next))
+                scope = next;
+            attributes += next;
+        }
+    }
+
+    private void parseNameAndRetType(List list) {
+        int size = list.size();
+        int idx;
+        // "operator" is a key word so if it's present we know we're
+        // dealing with operator overloading. The operator that's been
+        // overloaded might have been split up into multiple tokens.
+        for (idx = 0; idx < size; idx++)
+            if ("operator".equals(list.get(idx)))
+                break;
+
+        if (idx < size) {
+            methodName = "";
+            for (int i = idx; i < size; i++)
+                methodName += (String) list.get(i);
+        } else { // No operator overloading
+            methodName = "" + list.get(size - 1);
+            idx = size - 1;
+        }
+
+        // If it's a destructor, the "~" will be split out into a separate
+        // token, so add it onto the methodName here.
+        if (idx > 0 && "~".equals(list.get(idx - 1))) {
+            methodName = "~" + methodName;
+            idx--;
+        }
+
+        // The class name comes before the method name
+        while (idx > 0 && ((String) list.get(idx - 1)).endsWith("::")) {
+            if (null == className)
+                className = (String) list.get(idx - 1);
+            else
+                className = (String) list.get(idx - 1) + className;
+            idx--;
+        }
+
+        // Whatever's left before the classname/methodname must be the
+        // return type
+        ArrayList retParm = new ArrayList();
+        for (int i = 0; i < idx; i++)
+            retParm.add(list.get(i));
+
+        returnType = new Parameter(retParm, true);
+    }
+
+    /**
+     * Constructs the parameter list
+     */
+    private void parseParameters(List list) {
+        ArrayList alParams = new ArrayList();
+        Iterator it = list.iterator();
+        String token = (String) it.next(); // step over the (
+        while (it.hasNext() && !")".equals(token)) {
+            token = (String) it.next();
+
+            int template = 0; // Depth of template scope
+            boolean foundEquals = false;
+            // Ignore default value for an optional parameter
+            ArrayList parm = new ArrayList();
+            while (!token.equals(")") && (!token.equals(",") || template > 0)) {
+                if (token.equals("="))
+                    foundEquals = true;
+                if (!foundEquals)
+                    parm.add(token);
+                if (contains(token, "<"))
+                    template++;
+                if (contains(token, ">"))
+                    template--;
+                token = (String) it.next();
+            }
+
+            // No parameters so break out
+            if (token.equals(")") && 0 == parm.size())
+                break;
+
+            Parameter p = new Parameter(parm);
+            if (p.failed()) {
+                failed = true;
+                return;
+            }
+
+            // Copes with void func(void)
+            if (!p.isVoid())
+                alParams.add(p);
+        }
+
+        int size = alParams.size();
+        if (size > 0) {
+            params = new Parameter[size];
+            System.arraycopy(alParams.toArray(), 0, params, 0, size);
+        }
+    }
+
+    private void parseTrailingAttributes(List list) {
+        trailingAttributes = new String();
+        Iterator it = list.iterator();
+        while (it.hasNext()) {
+            if (trailingAttributes.length() > 0)
+                trailingAttributes += " ";
+            trailingAttributes += (String) it.next();
+        }
+    }
+
+    public String getOriginal() {
+        return originalText;
+    }
+
+    public int originalLength() {
+        return originalText.length();
+    }
+
+    public boolean failed() {
+        return failed;
+    }
+
+    public String getAttributes() {
+        return attributes;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    /**
+     * @param namespace The namespace to set.
+     */
+    public void setNamespace(String namespace) {
+        this.namespace = namespace;
+    }
+
+    /**
+     * @return Returns the namespace.
+     */
+    public String getNamespace() {
+        return namespace;
+    }
+
+    public String getTrimClassName() {
+        return trimClassName(className);
+    }
+
+    public String getMethodName() {
+        return methodName;
+    }
+
+    public Parameter getReturnType() {
+        return returnType;
+    }
+
+    public Parameter[] getParameters() {
+        return params;
+    }
+
+    public boolean isConstructor() {
+        return className != null && methodName != null
+                && trimClassName(className).equals(methodName);
+    }
+
+    public boolean isDestructor() {
+        return className != null && methodName != null
+                && methodName.startsWith("~")
+                && methodName.endsWith(trimClassName(className));
+    }
+
+    private static String trimClassName(String name) {
+        if (name.endsWith("::"))
+            return name.substring(0, name.length() - 2);
+        return name;
+    }
+
+    void setClassName(String className) {
+        if (null == className)
+            return;
+        if (!className.endsWith("::"))
+            className += "::";
+        this.className = className;
+    }
+
+    public String getScope() {
+        return scope;
+    }
+
+    /**
+     * Sets the scope, but only if the scope is not set by an explicit attribute
+     * in the signature.
+     */
+    public void setScope(String scope) {
+        if (-1 == attributes.indexOf(this.scope))
+            this.scope = scope;
+    }
+
+    /**
+     * Should this method be traced?
+     */
+    public boolean traceable() {
+        return traceable;
+    }
+
+    private static boolean contains(String src, String tgt) {
+        if (src == null || tgt == null)
+            return false;
+        if (-1 == src.indexOf(tgt))
+            return false;
+        return true;
+    }
+
+    public boolean equals(Object obj) {
+        if (null == obj || !(obj instanceof Signature))
+            return false;
+        Signature that = (Signature) obj;
+        if (!Utils.safeEquals(className, that.className))
+            return false;
+        if (!Utils.safeEquals(methodName, that.methodName))
+            return false;
+        if (!Utils.safeEquals(returnType, that.returnType))
+            return false;
+        if (null == params && null == that.params)
+            return true;
+        if (null != params && null == that.params)
+            return false;
+        if (null == params && null != that.params)
+            return false;
+        if (params.length != that.params.length)
+            return false;
+        for (int i = 0; i < params.length; i++)
+            if (!Utils.safeEquals(params[i], that.params[i]))
+                return false;
+        return true;
+    }
+
+    public String toStringWithoutAttrs() {
+        String s = new String();
+        if (returnType != null)
+            s += returnType + " ";
+        if (className != null)
+            s += className;
+        s += methodName + "(";
+        for (int i = 0; params != null && i < params.length; i++) {
+            if (i > 0)
+                s += ", ";
+            s += params[i].toString();
+        }
+        s += ")";
+        return s;
+    }
+
+    public String toString() {
+        String s = attributes;
+        if (attributes.length() > 0)
+            s += " ";
+        s += toStringWithoutAttrs();
+        if (trailingAttributes.length() > 0)
+            s += " " + trailingAttributes;
+        return s;
+    }
+}
\ No newline at end of file

Propchange: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Signature.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Signature.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Utils.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Utils.java?view=auto&rev=556089
==============================================================================
--- incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Utils.java (added)
+++ incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Utils.java Fri Jul 13 11:26:14 2007
@@ -0,0 +1,556 @@
+/**
+ *
+ *  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.
+ */
+
+/* @version $Rev$ $Date$ */
+
+/*
+*  Branched from the original class that was also contributed to the 
+*  org.apache.axis.tools.common package.
+*  
+*/
+package org.apache.tuscany.sca.cpp.tools.common;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+//Apache Common Logging
+//import org.apache.commons.logging.Log; 
+//import org.apache.commons.logging.LogFactory; 
+
+/**
+* Static utility methods. Some of these methods are similar to the methods on
+* java.lang.String except they are aware of C/C++ comments and string literals.
+* 
+* TODO: Many of these methods would perform better using StringBuffer not
+* String
+*/
+public final class Utils {
+   // All the C primitive data types
+   public final static Set cPrimitives = new HashSet(Arrays
+           .asList(new Object[] { "void", "byte", "char", "unsigned",
+                   "signed", "int", "short", "long", "double", "float",
+                   "struct", "class", "enum", "union" }));
+
+   // All the qualifiers that can affect C types
+   public final static Set cTypeQualifiers = new HashSet(
+           Arrays.asList(new Object[] { "(", ")", "*", ",", "&", "]", "[",
+                   "const" }));
+
+   public final static String whitespace = " \t\r\n";
+
+   //private static Log log = LogFactory.getLog(CLASS.class);
+
+   /**
+    * Never instantiate this class
+    */
+   private Utils() {
+   }
+
+   /**
+    * Is this string all whitespace?
+    */
+   static boolean isSpace(String s) {
+       for (int i = 0; i < s.length(); i++)
+           if (!Character.isWhitespace(s.charAt(i)))
+               return false;
+       return true;
+   }
+
+   // TODO look for other trailing chars like { (because of class{)
+   static boolean startsWith(String source, String target) {
+       if (source == null || target == null)
+           return false;
+       if (!source.startsWith(target))
+           return false;
+       if (source.length() == target.length())
+           return true;
+       if (Character.isWhitespace(source.charAt(target.length())))
+           return true;
+       return false;
+   }
+
+   /**
+    * Performs a C-aware version of String.indexOf(char) in that it skips
+    * characters in string literals and comments.
+    */
+   static int indexOf(String s, char c) throws ParsingException {
+       if ('"' == c)
+           rude("Utils.indexOf cannot be passed quotes");
+
+       for (int i = 0; i < s.length(); i++) {
+           if (s.charAt(i) == c)
+               return i;
+
+           i = skip(s.substring(i), i);
+           if (-1 == i)
+               return -1;
+       }
+       return -1;
+   }
+
+   /**
+    * Performs a C-aware version of String.indexOf(String) in that it skips
+    * characters in string literals and comments and makes sure that the target
+    * string is not embedded in a longer word.
+    */
+   static int indexOf(String s, String t) {
+       char t0 = t.charAt(0);
+       for (int i = 0; i < s.length(); i++) {
+           if (s.charAt(i) == t0
+                   && s.substring(i).startsWith(t)) {
+               
+
+               // When finding a single non-alphanumeric character
+               if(t.length() == 1 && !Character.isLetterOrDigit(t0))
+                   return i;
+               
+               // When finding an alphanumeric string
+               if((0 == i || !Character.isLetterOrDigit(s.charAt(i - 1))) // Check we're matching at the start of a word
+                   && (s.length() == (i + t.length()) || !Character
+                           .isLetterOrDigit(s.charAt(i + t.length()))))   // Check we're still matching by the end of the word
+                   return i;
+           }
+
+           i = skip(s.substring(i), i);
+           if (-1 == i)
+               return -1;
+       }
+       return -1;
+   }
+
+   /**
+    * Matches braces or quotes and is C-aware. It skips characters in string
+    * literals and comments.
+    */
+   static int findMatching(String s, char c1, char c2) {
+       int depth = 0;
+       for (int i = 0; i < s.length(); i++) {
+           if (s.charAt(i) == c1)
+               depth++;
+           else if (s.charAt(i) == c2) {
+               depth--;
+               if (depth == 0)
+                   return i;
+           } else {
+               i = skip(s.substring(i), i);
+               if (-1 == i)
+                   return -1;
+           }
+       }
+       return -1;
+   }
+
+   /**
+    * Failed to parse the source code for some reason. This method prints out a
+    * suitably rude message, and then what? I haven't quite decided yet.
+    * 
+    * TODO: Do something sensible here like throw an Exception which will give
+    * up on this file completely and tidy up the output file. It may be just
+    * too dangerous to try to carry on. But we need to fail in such a way that
+    * the build system knows that we've failed for this file and can build this
+    * file without trace.
+    */
+   public static void rude(String reason, String filename, int lineno,
+           String codefragment) throws ParsingException {
+
+       String text = "Bad C++ code!! ";
+       if (reason != null)
+           text += reason;
+       if (filename != null)
+           text += " " + filename + " lineno=" + lineno;
+       if (codefragment != null)
+           text += " <" + codefragment + ">";
+       System.err.println(text);
+       throw new ParsingException();
+   }
+
+   /**
+    * This method reports an error level problem
+    * 
+    * @param reason
+    *            why we have an error level problem
+    */
+   public static void rude(String reason) throws ParsingException {
+       // Apache commons logging
+       // log.error(Object line, null);
+       // or for now....
+       rude(reason, null, 0, null);
+   }
+
+   /**
+    * This method reports an error level problem
+    * 
+    * @param reason
+    *            why we have an error level problem
+    */
+   public static void screenMessage(String msg) {
+       // Apache commons logging
+       // log.error(Object line, null);
+       // or for now....
+       System.out.println(msg);
+   }
+
+   /**
+    * Escapes special characters like " so that they can be output in a C
+    * string literal. Also removes newlines, since C string literals can't be
+    * split over lines.
+    */
+   String pretty(String s) {
+       StringBuffer sb = new StringBuffer(s);
+       for (int i = 0; i < sb.length(); i++)
+           switch (sb.charAt(i)) {
+           case '"':
+               sb = sb.insert(i, '\\');
+               i++;
+               break;
+           case '\n':
+               sb = sb.deleteCharAt(i);
+               i--;
+               break;
+           }
+       return sb.toString();
+   }
+
+   private static boolean startsWithComment(String s) {
+       if (null == s || s.length() < 2)
+           return false;
+       if (s.startsWith("//"))
+           return true;
+       if (s.startsWith("/*"))
+           return true;
+       return false;
+   }
+
+   private static int endOfComment(String s) {
+       int idx;
+       if (s.startsWith("//"))
+           idx = s.indexOf("\n");
+       else {
+           idx = s.indexOf("*/");
+           if (-1 != idx)
+               idx++; // Step over */
+       }
+       return idx;
+   }
+
+   private static boolean startsWithStringLiteral(String s) {
+       if (null == s || s.length() < 1)
+           return false;
+       if (s.startsWith("\"") || s.startsWith("'"))
+           return true;
+       return false;
+   }
+
+   private static int endOfStringLiteral(String s) {
+       boolean escape = false;
+       char c0 = s.charAt(0);
+       for (int i = 1; i < s.length(); i++) {
+           if (!escape && s.charAt(i) == c0)
+               return i;
+
+           // \" or \' does not end the literal
+           if ('\\' == s.charAt(i))
+               // Escaping a \ should switch escape off so \\' does end
+               // the literal
+               escape = !escape;
+           else
+               escape = false;
+       }
+       return -1;
+   }
+
+   /**
+    * If the String s starts with a string literal or a comment, return i plus
+    * the index of the end of the literal or comment. String literals are
+    * enclosed in " or ' and comments start with /* or //.
+    */
+   private static int skip(String s, int i) {
+       int j = 0;
+       if (startsWithStringLiteral(s)) {
+           j = endOfStringLiteral(s);
+           if (-1 == j)
+               return -1;
+       } else if (startsWithComment(s)) {
+           j = endOfComment(s);
+           if (-1 == j)
+               return -1;
+       }
+       return i + j;
+   }
+
+   /**
+    * A better method than .equals() because it doesn't NullPointerException
+    * when one of the parameters is null.
+    */
+   public static boolean safeEquals(Object o1, Object o2) {
+       if (null == o1 && null == o2)
+           return true;
+       if (null == o1 && null != o2)
+           return false;
+       if (null != o1 && null == o2)
+           return false;
+       return o1.equals(o2);
+   }
+
+   public static void outputDebugString(String line) {
+       if (!Options.quiet()) {
+           if (Options.debug())
+               // Apache commons logging
+               // log.debug(Object line, null);
+               // or for now
+               System.out.println(line);
+       }
+   }
+
+   /**
+    * This static method allows different parts of the code to inform about
+    * significant events. Code interested in specific types of event can
+    * register a listener against that type (not written yet)
+    * 
+    * @param eventType
+    *            An int type enum indicating the type of event.
+    * @param message
+    *            A message that can be output to the user.
+    */
+   public static final int EVENT_TYPE_XML_ITEM_PARSED = 1;
+
+   public static final int EVENT_TYPE_FILE_PARSED = 2;
+
+   public static final int EVENT_TYPE_FILE_CREATE = 3;
+
+   public static final int VERBOSE_LIMIT = 1024;
+
+   public static final int DEPLOYMENT_ARTEFACT = VERBOSE_LIMIT;
+
+   public static final int DEPLOYMENT_ARTEFACT_ENCOUNTERED = DEPLOYMENT_ARTEFACT + 1;
+
+   public static final int DEPLOYMENT_ARTEFACT_GENERATED = DEPLOYMENT_ARTEFACT + 2;
+
+   public static final int DEPLOYMENT_INPUT_DIRECTORY = DEPLOYMENT_ARTEFACT + 3;
+
+   public static final int DEPLOYMENT_OUTPUT_DIRECTORY = DEPLOYMENT_ARTEFACT + 4;
+
+   private static boolean reportArtefacts = false;
+
+   /**
+    * An easily callable method to allow tracking/reposting of events in scagen
+    * and other tools.
+    * 
+    * @param eventType
+    *            used for classifying event
+    * @param message
+    *            a user readable message
+    */
+   public static void postEvent(int eventType, String message) {
+       if (Options.verbose() && eventType < VERBOSE_LIMIT) {
+           screenMessage(message);
+       }
+
+       if ((eventType & DEPLOYMENT_ARTEFACT) > 0) {
+           reportArtefact(message, eventType);
+       }
+
+   }
+
+   /**
+    * @param message
+    *            The user message
+    * @param eventType
+    *            The type of event (input or output). This is used to determine
+    *            if the path name of the file starts with the COMPOSITE_ROOT
+    *            directory or the given output directory as the one of these
+    *            prefixes is removed from the path name in order to give the
+    *            new (destination) path relative to the new composite root
+    * 
+    *  
+    */
+
+   static String scagenInputDir = "COMPOSITE_ROOT";
+
+   static String scagenOutputDir = "SCAGEN_OUTPUT";
+
+   static String newCompositeRoot = "NEW_COMPOSITE_ROOT";
+
+   static String generatedDirName = "$sourceDir1";
+
+   private static void reportArtefact(String message, int eventType) {
+
+       if (Utils.isReportArtefacts()) {
+
+           // Changing the value of the variable below will alter the output of
+           // the
+           // deploy assist strings:
+           //    true will result in a "copy source NEW_COMPOSITE_ROOT\dest" output
+           // and
+           //    false will result in a "inputDir c:\fred"
+           //                           "outputDir c:\bob"
+           //                           "input c:\fred\sca.composite"
+           //                           "output c:\bob\proxy.h" type output
+           String command = null;
+
+           try {
+               newCompositeRoot = (String) Options.getOption("-deploy");
+               command = (String) Options.getOption("-command");
+           } catch (Exception e) {
+               // let it default
+           }
+
+           if (null == newCompositeRoot) {
+               newCompositeRoot = "DEPLOY_COMPOSITE_ROOT";
+           }
+
+           if (null == command) {
+               command = "copy";
+           }
+
+            if (Options.outputCommand()) {
+
+               String tail = message;
+               switch (eventType) {
+               case DEPLOYMENT_ARTEFACT_ENCOUNTERED:
+                   if (message.startsWith(scagenInputDir)) {
+                       tail = message.substring(scagenInputDir.length());
+                   }
+
+                   String dest = joinPathElements(newCompositeRoot, tail);
+
+                    System.out.println(command + " " + platformSlashes(message)
+                            + " " + platformSlashes(dest));
+                   break;
+
+               case DEPLOYMENT_ARTEFACT_GENERATED:
+                   if (message.startsWith(scagenOutputDir)) {
+                       tail = message.substring(scagenOutputDir.length());
+                   }
+
+                   dest = joinPathElements(newCompositeRoot, tail);
+                    System.out.println(command + " " + platformSlashes(message)
+                            + " " + platformSlashes(dest));
+                   break;
+               case DEPLOYMENT_INPUT_DIRECTORY:
+                   scagenInputDir = message;
+                   //System.out.println("inputDir " + message);
+                   break;
+               case DEPLOYMENT_OUTPUT_DIRECTORY:
+                   scagenOutputDir = message;
+                   //System.out.println("outputDir " + message);
+                   break;
+               default:
+                   break;
+               }
+
+           } else {
+
+                if (Options.list()) {
+                    switch (eventType) {
+                    case DEPLOYMENT_ARTEFACT_ENCOUNTERED:
+                    case DEPLOYMENT_ARTEFACT_GENERATED:
+                        System.out.println(platformSlashes(message));
+                        break;
+                    case DEPLOYMENT_INPUT_DIRECTORY:
+                    case DEPLOYMENT_OUTPUT_DIRECTORY:
+                    default:
+                        break;
+                    }
+                } else {
+               switch (eventType) {
+               case DEPLOYMENT_ARTEFACT_ENCOUNTERED:
+                   //TODO make efficient
+                   System.out.println("$sourceDir1"
+                                + platformSlashes(message.substring(scagenInputDir.length())));
+                   break;
+               case DEPLOYMENT_ARTEFACT_GENERATED:
+                   //TODO make efficient
+                   System.out.println(generatedDirName
+                                + platformSlashes(message.substring(scagenOutputDir.length())));
+                   break;
+               case DEPLOYMENT_INPUT_DIRECTORY:
+                        scagenInputDir = platformSlashes(message);
+                        System.out.println("sourceDir1=" + scagenInputDir);
+                   break;
+               case DEPLOYMENT_OUTPUT_DIRECTORY:
+                        scagenOutputDir = platformSlashes(message);
+                   if (!scagenInputDir.equals(scagenOutputDir)) {
+                       generatedDirName = "$sourceDir2";
+                            System.out.println("sourceDir2=" + scagenOutputDir);
+                   } else {
+                       //generatedDirName = "sourceDir1";
+                   }
+                   break;
+               default:
+                   break;
+               }
+           }
+       }
+   }
+    }
+
+   /**
+    * @param tail
+    * @param tail
+    * @return
+    */
+   public static String joinPathElements(String root, String tail) {
+       String separator;
+       // Stick in a "/" (File.separator) if required.
+       if ((tail.substring(0, 1).equals("/") || newCompositeRoot.substring(
+               root.length() - 1, root.length()).equals("/"))
+               || (tail.substring(0, 1).equals("\\") || root.substring(
+                       root.length() - 1, root.length()).equals("\\"))
+
+       ) {
+           separator = "";
+       } else {
+           separator = File.separator;
+       }
+       String dest = newCompositeRoot + separator + tail;
+       return dest;
+   }
+
+   /**
+    * @param reportArtefacts
+    *            The reportArtefacts to set.
+    */
+   public static void setReportArtefacts(boolean reportArtefacts) {
+       Utils.reportArtefacts = reportArtefacts;
+   }
+
+   /**
+    * @return Returns the reportArtefacts.
+    */
+   private static boolean isReportArtefacts() {
+       return reportArtefacts;
+   }
+
+   private static String platformSlashes(String path) {
+       if (null == path) {
+           return path;
+       }
+       // We need a double level of \\ escapes if the slashes are
+       // this way round.
+       String separatorForRegex = File.separator
+               .replaceAll("\\\\", "\\\\\\\\");
+       return path.replaceAll("[/\\\\]+", separatorForRegex);
+
+   }
+
+}

Propchange: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Utils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Utils.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/package.html
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/package.html?view=auto&rev=556089
==============================================================================
--- incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/package.html (added)
+++ incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/package.html Fri Jul 13 11:26:14 2007
@@ -0,0 +1,58 @@
+<!--
+   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.
+-->
+
+<html>
+
+<head>
+<title>Design documentation for org\apache\tuscany\sca\cpp\tools\common</title>
+</head>
+
+<body lang=EN-GB>
+
+<div class=Section1>
+
+<h1>Overview</h1>
+
+This package can be used to reflect across C++ source code. It can produce
+a network of descriptive objects describing C++ Headers, Signatures, Parameters and so
+on that it finds in a given location of the file system.
+Each of the descriptive objects has a set of getters that return either 
+the descriptive child objects, or for primitives, the string that represents the actual
+value such as "int" or "myFunction".
+<p>
+There are also various utility methods that help with navigating the information, for example the Signature
+class has an isConstructor method. The API Javadoc contains further details of these. 
+<p>
+The package can scan a directory using a file mask to identify what types
+of files are to be scanned. In this application we are interested only 
+in the function prototypes in the C++ header files. 
+<p>
+The implementation was originated using some java code that was also 
+contributed to the Apache org.apache.axis.tools.common package. Care
+has been taken that the original code was not sourced via Apache. If
+this project is adopted by Apache then it is very possible that this 
+package could be merged with or made obsolete by org.apache.axis.tools.common
+and because of this the design and interfaces have been preserved from
+the original code as much as possible.
+
+<p>
+</div>
+</body>
+
+</html>

Propchange: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/package.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ComponentDomNodeHandler.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ComponentDomNodeHandler.java?view=auto&rev=556089
==============================================================================
--- incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ComponentDomNodeHandler.java (added)
+++ incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ComponentDomNodeHandler.java Fri Jul 13 11:26:14 2007
@@ -0,0 +1,366 @@
+/**
+ *
+ *  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.
+ */
+
+/* @version $Rev$ $Date$ */
+
+package org.apache.tuscany.sca.cpp.tools.services;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.tuscany.sca.cpp.tools.common.Headers;
+import org.apache.tuscany.sca.cpp.tools.common.Signature;
+import org.apache.tuscany.sca.cpp.tools.common.Utils;
+import org.w3c.dom.Node;
+
+/**
+ * This class will do the required processing for the <component>element of a
+ * sca composite file.
+ */
+public class ComponentDomNodeHandler extends GenericDomNodeHandler {
+
+    /**
+     * This method will do the "normal" processing and then trigger a call to
+     * processComponentNode.
+     * 
+     * @param node
+     *            the node being processed
+     * @param contextXPath
+     *            the XPath to the node
+     * @param handlers
+     *            the map pf element names to DomNodeHandlers
+     * @param parameters
+     *            a map of XPaths to parameters values found so far
+     */
+
+    public void handleNode(Node node, String contextXPath, Map handlers,
+            Map parameters) {
+
+        // Pick up attrs and the interface.cpp child elements
+        super.handleNode(node, contextXPath, handlers, parameters);
+
+        try {
+            //OK now go and create the wrapper and proxy for the service
+            processComponentNode(contextXPath, parameters);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    /**
+     * This method basically moved from the text names of things to operating on
+     * the actual Files. It will also verify or work out the correct class name
+     * for the implmentation and complain if this does match at least one
+     * potential service method in the class.
+     * 
+     * @param contextXPath
+     *            used to pull the correct values from the parameters map (as
+     *            there can be multiple implementation.cpp elelements in there).
+     * @param parameters
+     *            a map of XPath keys to attribute values
+     * @throws Exception
+     */
+    private void processComponentNode(String contextXPath, Map parameters)
+            throws Exception {
+
+        String implHeader = (String) parameters.get(contextXPath
+                + "/implementation.cpp/@header");
+        String implClass = (String) parameters.get(contextXPath
+                + "/implementation.cpp/@class");
+
+        File compositeOrFragmentFile = (File) parameters
+                .get("compositeOrFragmentFile");
+        File implHeaderFile = null;
+        if (null != compositeOrFragmentFile) {
+            File dir = compositeOrFragmentFile.getParentFile();
+            implHeaderFile = new File(dir, implHeader);
+        } else {
+            throw new InternalError(
+                    "Internal error: composite or fragment file not present in internal parameters");
+        }
+
+        try {
+            String resolvedImplClassName = getClassName(implHeaderFile,
+                    implClass);
+
+            // Check or retrieve the impl Class name.
+            if (null == resolvedImplClassName) {
+                try {
+                    //A class attribute was set but there were no methods of
+                    // the
+                    // class in the header
+                    System.out
+                            .println("Classname given ("
+                                    + implClass
+                                    + ") does not match any header file method's classes in file: "
+                                    + implHeaderFile.getCanonicalPath());
+                } catch (IOException e) {
+                    System.out
+                            .println("Classname given ("
+                                    + implClass
+                                    + ") does not match any header file method's classes in file: "
+                                    + implHeaderFile.getAbsolutePath());
+                }
+                return;
+            } else {
+                File target = (File) parameters.get("targetFile");
+                // go into the .componentType file and generate the cpp
+                processComponentTypeFile(implHeaderFile, target,
+                        resolvedImplClassName);
+
+            }
+        } catch (Exception e) {
+            String compName = (String) parameters
+                    .get("/compositeFragment/component/@name");
+            Utils
+                    .screenMessage("Problem interpreting header or class attributes in "
+                            + compName
+                            + " component, in "
+                            + compositeOrFragmentFile.getPath() + " file");
+            System.exit(-2);
+        }
+
+    }
+
+    /**
+     * The purpose of this method is to move from the DOM parameters to dealing
+     * with the actual Files involved. It is from this method that we kick off
+     * the processing of the componentType file.
+     * 
+     * @param header
+     *            the implementation header
+     * @param target
+     *            the directory for the output
+     * @param implClass
+     * @throws Exception
+     */
+    private void processComponentTypeFile(File header, File target,
+            String implClass) throws Exception {
+
+        // The componentType files should be in the same dir as the Impl
+        // header...
+        if (header == null || target == null) {
+            return;
+        }
+
+        File componentTypeDirectory = header.getParentFile();
+        String headerFileName = header.getName();
+        String componentTypeName = headerFileName.substring(0, headerFileName
+                .lastIndexOf("."));
+
+        File componentTypeFile = new File(componentTypeDirectory,
+                componentTypeName + ".componentType");
+
+        ComponentTypeFileHandler ctParser = new ComponentTypeFileHandler();
+
+        // The implClass is used in the generated wrapper code so we need to
+        // store
+        // it so we can tunnel through the standard actOnFile signature.
+
+        int namespaceEnd = -1;
+        if (null != implClass) {
+            namespaceEnd = implClass.lastIndexOf("::");
+        }
+
+        String namespace = null;
+
+        if (-1 != namespaceEnd) {
+            namespace = implClass.substring(0, namespaceEnd);
+            ctParser.setParameter("implNamespace", namespace);
+            implClass = implClass.substring(namespaceEnd + 2);
+        }
+
+        if (implClass != null) {
+            ctParser.setParameter("implClass", implClass);
+        }
+
+        try {
+            ctParser.handleComponentTypeFile(componentTypeFile, target);
+        } catch (Exception e) {
+            Utils
+                    .screenMessage("There has been a problem parsing the componentType file: "
+                            + componentTypeFile.getCanonicalPath());
+            Utils.screenMessage(" the reported errors is "
+                    + e.getLocalizedMessage());
+            Utils.screenMessage(" and the java exception stack is below.");
+            e.printStackTrace();
+            throw e;
+        }
+    }
+
+    /**
+     * The resolve and check the classname of the service. If we have an
+     * implementation class name we have to check that there is: at least one
+     * (non-private, non constructor or finalizer) method of that class in the
+     * header If there is no implementation class then we will return the class
+     * of the first non-private/constructor/finalizer method we find.
+     * 
+     * @param header
+     * @param implementationCppClass
+     * @return
+     * @throws Exception
+     */
+    private String getClassName(File header, String implementationCppClass)
+            throws Exception {
+        String methodClassName = null;
+        List methods = null;
+
+        if (null == header) {
+            return null;
+        }
+
+        Utils.postEvent(Utils.DEPLOYMENT_ARTEFACT_ENCOUNTERED, header
+                .getAbsolutePath());
+        Utils.postEvent(Utils.EVENT_TYPE_FILE_PARSED,
+                "Scagen processing C++ implementation header "
+                        + header.getAbsolutePath());
+
+        try {
+            Headers headers = new Headers();
+
+            headers.actOnFile(header, null, 1);
+
+            methods = headers.getAllMethods();
+
+        } catch (FileNotFoundException fnfe) {
+            String path;
+            try {
+                path = header.getCanonicalPath();
+            } catch (IOException e1) {
+                path = header.getPath();
+            }
+            Utils.screenMessage("The header file: " + path
+                    + " referenced cannot be found.");
+            throw fnfe;
+        } catch (Exception e) {
+            String path = header.getPath();
+            Utils.screenMessage("The header file: " + path
+                    + " referenced is not valid. Reason given is "
+                    + e.getLocalizedMessage());
+            throw e;
+        }
+
+        // We need at least some methods
+        if (null == methods) {
+            return null;
+        }
+
+        // We need at least one service method of to do anything
+        methods = trimMethodsOfPrivatesConstructorsAndDestrutors(methods);
+        if (null == methods || methods.size() == 0) {
+            return null;
+        }
+
+        // If the user specifies an implementation class then we need at
+        // least one service method of that class
+        if (implementationCppClass != null) {
+            methods = filterMethodsToOneClass(methods, implementationCppClass);
+
+            if (null == methods || methods.size() == 0) {
+                return null;
+            } else {
+                // There was at least one method of the correct type
+                return implementationCppClass;
+            }
+        } else {
+            // Implementation class is null so we return the fully qualified classname of the
+            // first service method
+            Signature s = (Signature) methods.get(0); 
+            String className = s.getTrimClassName();
+            String namespace = s.getNamespace();
+            if( namespace != null && namespace.length() > 0)
+            {
+                className = namespace + "::" + className;
+            }
+            
+            return className;
+        }
+    }
+
+    /**
+     * Filter the mthods supplied to only ones fo the supplied class.
+     * 
+     * @param methods
+     *            the list of methods
+     * @param implementationCppClass
+     *            the class we wish
+     * @return a list of methods of the correct class
+     */
+    private List filterMethodsToOneClass(List methods,
+            String implementationCppClass) {
+
+        if (null == methods) {
+            return null;
+        }
+
+        if (null == implementationCppClass
+                || implementationCppClass.length() == 0) {
+            return null;
+        }
+
+        for (Iterator iter = methods.listIterator(); iter.hasNext();) {
+            Signature method = (Signature) iter.next();
+
+            String className = method.getTrimClassName();
+            String namespace = method.getNamespace();
+
+            if (namespace != null && namespace.length() > 0) {
+                className = namespace + "::" + className;
+            }
+
+            if (!implementationCppClass.equals(className)) {
+                iter.remove();
+            }
+        }
+
+        return methods;
+
+    }
+
+    /**
+     * This method removes contructor and destructor methods from the list.
+     * 
+     * @param methods
+     *            the list of methods
+     * @return
+     */
+    private List trimMethodsOfPrivatesConstructorsAndDestrutors(List methods) {
+
+        if (null == methods) {
+            return null;
+        }
+
+        for (Iterator iter = methods.listIterator(); iter.hasNext();) {
+            Signature method = (Signature) iter.next();
+
+            if (method.isConstructor() || method.isDestructor()) {
+                iter.remove();
+            }
+        }
+
+        return methods;
+    }
+
+}

Propchange: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ComponentDomNodeHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ComponentDomNodeHandler.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ComponentTypeFileHandler.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ComponentTypeFileHandler.java?view=auto&rev=556089
==============================================================================
--- incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ComponentTypeFileHandler.java (added)
+++ incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ComponentTypeFileHandler.java Fri Jul 13 11:26:14 2007
@@ -0,0 +1,130 @@
+/**
+ *
+ *  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.
+ */
+
+/* @version $Rev$ $Date$ */
+
+package org.apache.tuscany.sca.cpp.tools.services;
+
+import java.io.File;
+
+import org.apache.tuscany.sca.cpp.tools.common.FileActor;
+import org.apache.tuscany.sca.cpp.tools.common.Utils;
+
+/**
+ * The purpose of this class is to specialise the map of XML element handlers
+ * for a XXX.componentType file that is used by the XMLFileActor
+ */
+public class ComponentTypeFileHandler extends XMLFileActor {
+
+    static {
+        // We set up a map for each element type we wish to handle
+        // this alows the XML handling code to be generic and type free
+        // while the handlers don't have to do mcuh XML handling.
+
+        GenericDomNodeHandler gdnh = new GenericDomNodeHandler();
+        handlers.put("componentType", gdnh);
+        handlers.put("interface.cpp", gdnh);
+
+        ServiceDomNodeHandler sdnh = new ServiceDomNodeHandler();
+        handlers.put("service", sdnh);
+
+        ReferenceDomNodeHandler rdnh = new ReferenceDomNodeHandler();
+        handlers.put("reference", rdnh);
+    }
+
+    /**
+     * This method just exists to add the default starting depth of 1 to the
+     * underlying actOnFile interface
+     * 
+     * @param componentTypeXML
+     * @param target
+     * @throws Exception
+     */
+    public void handleComponentTypeFile(File componentTypeXML, File target)
+            throws Exception {
+        // We have already set up the XML element handlers.
+        actOnFile(componentTypeXML, target, 1);
+        // We need do no more, the service and reference handlers
+        // ServiceDomNodeHandler and ReferenceDomNodeHandler
+        // will take appropriate action.
+    }
+
+    /**
+     * This method is the main FileActor method
+     * 
+     * @see FileActor#actOnFile(File, File, int) Here we create an initial DOM
+     *      and kick off the processing (using the handler map that has been set
+     *      up by the concrete subclass).
+     * 
+     * @param compositeXML
+     *            the composite or fragment file
+     * @param target
+     *            the target directory
+     * @param depth
+     *            not uesed here but in the
+     * @see FileActor#actOnFile(File, File, int) interface to allow for
+     *      recursive diving into a directory structure.
+     */
+    public void actOnFile(File fileXML, File target, int depth)
+            throws Exception {
+
+        if (null == fileXML || null == target) {
+            return;
+        }
+
+        parameters.put("componentTypeFile", fileXML);
+        
+        Utils.postEvent(Utils.DEPLOYMENT_ARTEFACT_ENCOUNTERED, fileXML.getAbsolutePath());
+        Utils.postEvent(Utils.EVENT_TYPE_FILE_PARSED, "Scagen processing SCA componentType file " + fileXML.getAbsolutePath());
+
+        super.actOnFile(fileXML, target, depth);
+
+    }
+
+    /**
+     * @return an error message - usually over-ridden.
+     */
+    protected String getContextMessage() {
+
+        String composite = ((File) parameters.get("compositeOrFragmentFile")).getPath();
+        if (null == composite) {
+            composite = "unknown";
+        }
+
+        String component = (String) parameters.get("/composite/component/@name");
+        if (null == component) {
+            component = (String) parameters
+                    .get("/compositeFragment/component/@name");
+        }
+        if (null == component) {
+            composite = "unknown";
+        }
+
+        String msg = "when processing composite " + composite;
+
+        msg = msg
+                + "\nin this composite file, the component \""
+                + component
+                + "\" has an implementation.cpp element with a header attribute \nwhere the C++ header can be found but it has no matching .componentType file present in\nthe same directory as the header.";
+
+        return msg;
+    }
+
+}
\ No newline at end of file

Propchange: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ComponentTypeFileHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ComponentTypeFileHandler.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/CompositeOrFragmentFileHandler.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/CompositeOrFragmentFileHandler.java?view=auto&rev=556089
==============================================================================
--- incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/CompositeOrFragmentFileHandler.java (added)
+++ incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/CompositeOrFragmentFileHandler.java Fri Jul 13 11:26:14 2007
@@ -0,0 +1,91 @@
+/**
+ *
+ *  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.
+ */
+
+/* @version $Rev$ $Date$ */
+
+package org.apache.tuscany.sca.cpp.tools.services;
+
+import java.io.File;
+
+import org.apache.tuscany.sca.cpp.tools.common.FileActor;
+import org.apache.tuscany.sca.cpp.tools.common.Utils;
+
+/**
+ * The purpose of this class is purely to specialise the handler map to one with
+ * a specific ComponentDomNodeHandler.
+ */
+public class CompositeOrFragmentFileHandler extends XMLFileActor {
+
+    static {
+
+        GenericDomNodeHandler gdnh = new GenericDomNodeHandler();
+
+        /*
+         * We use a specific Component node handler in order to be able to
+         * process multiple components in the same XML file
+         */
+        ComponentDomNodeHandler componentdnh = new ComponentDomNodeHandler();
+        handlers.put("component", componentdnh);
+
+        /*
+         * We are interested inthe elements below but they only need standard
+         * processing
+         */
+        handlers.put("composite", gdnh);
+        handlers.put("compositeFragment", gdnh);
+        handlers.put("implementation.cpp", gdnh);
+    }
+
+    /**
+     * This method is the main FileActor method
+     * 
+     * @see FileActor#actOnFile(File, File, int) Here we create an initial DOM
+     *      and kick off the processing (using the handler map that has been set
+     *      up by the concrete subclass).
+     * 
+     * @param compositeXML
+     *            the composite or fragment file
+     * @param target
+     *            the target directory
+     * @param depth
+     *            not uesed here but in the
+     * @see FileActor#actOnFile(File, File, int) interface to allow for
+     *      recursive diving into a directory structure.
+     */
+    public void actOnFile(File compositeXML, File target, int depth)
+            throws Exception {
+
+        if (null == compositeXML || null == target) {
+            return;
+        }
+
+        parameters.put("compositeOrFragmentFile", compositeXML);
+
+        Utils.postEvent(Utils.DEPLOYMENT_ARTEFACT_ENCOUNTERED, compositeXML
+                .getAbsolutePath());
+
+        Utils.postEvent(Utils.EVENT_TYPE_FILE_PARSED,
+                "Scagen processing SCA composite file "
+                        + compositeXML.getAbsolutePath());
+
+        super.actOnFile(compositeXML, target, depth);
+
+    }
+}
\ No newline at end of file

Propchange: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/CompositeOrFragmentFileHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/CompositeOrFragmentFileHandler.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/DirectoryScanner.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/DirectoryScanner.java?view=auto&rev=556089
==============================================================================
--- incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/DirectoryScanner.java (added)
+++ incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/DirectoryScanner.java Fri Jul 13 11:26:14 2007
@@ -0,0 +1,93 @@
+/**
+ *
+ *  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.
+ */
+
+/* @version $Rev$ $Date$ */
+
+package org.apache.tuscany.sca.cpp.tools.services;
+
+import java.io.File;
+import java.util.Set;
+
+import org.apache.tuscany.sca.cpp.tools.common.FileActor;
+import org.apache.tuscany.sca.cpp.tools.common.Utils;
+
+public class DirectoryScanner {
+    private FileActor actor;
+
+    private Set actOnTheseFileExtensions;
+
+    public DirectoryScanner(FileActor actor, Set extensions) {
+        this.actor = actor;
+        this.actOnTheseFileExtensions = extensions;
+    }
+
+    /**
+     * 
+     * @param source
+     *            The composite root directory
+     * @param target
+     *            The directory that will hold the generated output
+     * @param depth
+     *            The depth from the initial starting point, not significant for
+     *            the Scagen tool as we are only interested in the composite root
+     *            directory but present due to the FileActor actOnFile interface
+     *            method. This code is pulled from the code in the CParsingTool
+     *            class and further work is needed to remove the duplication.
+     *            Tnterface has been left unchanged as we hope to reconverge the
+     *            parser here with the original one once the changes are fed
+     *            back into the original code.
+     * @throws Exception
+     */
+    public void walkTree(File source, File target, int depth) throws Exception {
+        depth++;
+        boolean noTarget = (null == target);
+
+        if (!source.canRead())
+            Utils.rude("Cannot read from source directory " + source);
+        if (!noTarget && !target.canWrite())
+            Utils.rude("Cannot write to target directory " + target);
+
+        if (source.isDirectory()) {
+            File[] filesInDirectory = source.listFiles();
+            for (int i = 0; i < filesInDirectory.length; i++) {
+                File file = filesInDirectory[i];
+                String name = file.getName();
+                int dot = name.lastIndexOf('.');
+                String ext = null;
+                if (-1 != dot) {
+                    ext = name.substring(dot + 1);
+                }
+
+                if (file.isFile()
+                        && (actOnTheseFileExtensions == null || (!file
+                                .isHidden() && actOnTheseFileExtensions
+                                .contains(ext)))) {
+                    // this is a file we need to act on!
+                    actor.actOnFile(file, target, depth);
+                }
+            }
+        } else {
+            return; // Do not act on single files for now we expect a composite
+            // root directory
+            // and the "main" class checks its parameters to ensure this is so.
+        }
+    }
+
+}
\ No newline at end of file

Propchange: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/DirectoryScanner.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/DirectoryScanner.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/DomHandler.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/DomHandler.java?view=auto&rev=556089
==============================================================================
--- incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/DomHandler.java (added)
+++ incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/DomHandler.java Fri Jul 13 11:26:14 2007
@@ -0,0 +1,83 @@
+/**
+ *
+ *  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.
+ */
+
+/* @version $Rev$ $Date$ */
+
+package org.apache.tuscany.sca.cpp.tools.services;
+
+import java.util.Map;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * The purpose of this class it to provide a generic class that can handle both
+ * a DOM and a DOM node.
+ *  
+ */
+public class DomHandler extends GenericDomNodeHandler {
+    /**
+     * This method will run through the initial level of the DOM using the
+     * handlers map
+     * 
+     * @param dom
+     *            the document being consumed
+     * @param handlers
+     *            the map from element name to node handler
+     * @param parameters
+     *            a map of parameters - this is often used by a handler to place
+     *            a name-value pair, the name is often an Xpath representation
+     *            of the location of the data in the DOM but handlers are free
+     *            to use whatever they like - the contextXpath is generated as
+     *            an Xpath prefix for those handlers that wish to use it.
+     */
+    public static void handleDom(Document dom, Map handlers, Map parameters) {
+        if (dom != null) {
+            NodeList childNodes = dom.getChildNodes();
+            for (int i = 0; i < childNodes.getLength(); i++) {
+                Node childNode = childNodes.item(i);
+                mapNodeToHandlerAndHandle(childNode, "/"
+                        + childNode.getNodeName(), handlers, parameters);
+            }
+        }
+    }
+
+    /**
+     * 
+     * @param node
+     *            The DOM node being consumed
+     * @param contextXPath
+     *            The XPath to this node
+     * @param handlers
+     *            The map from element name to node handler
+     * @param parameters
+     *            A map of parameters - this is often used by a handler to place
+     *            a name-value pair, the name is often an Xpath representation
+     *            of the location of the data in the DOM but handlers are free
+     *            to use whatever they like - the contextXpath is generated as
+     *            an Xpath prefix for those handlers that wish to use it.
+     */
+    public void handleNode(Node node, String contextXPath, Map handlers,
+            Map parameters) {
+        mapNodeToHandlerAndHandle(node, contextXPath, handlers, parameters);
+    }
+
+}
\ No newline at end of file

Propchange: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/DomHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/cpp/sca/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/DomHandler.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org