Added:
maven/sandbox/maven-shared-java-parser/src/main/java/org/apache/maven/shared/parser/java/JavaQNameImpl.java
URL:
http://svn.apache.org/viewvc/maven/sandbox/maven-shared-java-parser/src/main/java/org/apache/maven/shared/parser/java/JavaQNameImpl.java?view=auto&rev=483673
==============================================================================
---
maven/sandbox/maven-shared-java-parser/src/main/java/org/apache/maven/shared/parser/java/JavaQNameImpl.java
(added)
+++
maven/sandbox/maven-shared-java-parser/src/main/java/org/apache/maven/shared/parser/java/JavaQNameImpl.java
Thu Dec 7 13:32:25 2006
@@ -0,0 +1,508 @@
+/*
+ * Copyright 2003, 2004 The Apache Software Foundation
+ *
+ * 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.maven.shared.parser.java;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+/** <p>Accessor class for JavaQName.</p>
+ *
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Jochen Wiedmann</a>
+ * @version $Id$
+ */
+public class JavaQNameImpl
+{
+ private static final Map names = new HashMap();
+
+ private abstract static class DefaultImpl
+ implements JavaQName
+ {
+ public int compareTo( Object pOther )
+ {
+ JavaQName other = (JavaQName) pOther;
+ if ( isArray() )
+ {
+ if ( !other.isArray() )
+ {
+ return -1;
+ }
+ else
+ {
+ return getInstanceClass().compareTo(
other.getInstanceClass() );
+ }
+ }
+ else
+ {
+ if ( other.isArray() )
+ {
+ return 1;
+ }
+ }
+ int result = getPackageName().compareTo( other.getPackageName() );
+ if ( result != 0 )
+ {
+ return result;
+ }
+ result = getClassName().compareTo( other.getClassName() );
+ if ( result != 0 )
+ {
+ return result;
+ }
+ return 0;
+ }
+
+ public int hashCode()
+ {
+ return getPackageName().hashCode() + getClassName().hashCode();
+ }
+
+ public boolean equals( Object pOther )
+ {
+ if ( pOther == null || !( pOther instanceof JavaQName ) )
+ {
+ return false;
+ }
+ return compareTo( pOther ) == 0;
+ }
+ }
+
+ private static class StandardImpl
+ extends DefaultImpl
+ {
+ private String packageName, className;
+
+ public StandardImpl( String pPackageName, String pClassName )
+ {
+ checkPackageName( pPackageName );
+ packageName = pPackageName;
+ className = pClassName;
+ }
+
+ protected void checkPackageName( String pPackageName )
+ {
+ for ( StringTokenizer st = new StringTokenizer( pPackageName, "."
); st.hasMoreTokens(); )
+ {
+ String tok = st.nextToken();
+ if ( tok.length() == 0 )
+ {
+ throw new IllegalArgumentException( "Invalid package name:
" + pPackageName );
+ }
+ for ( int i = 0; i < tok.length(); i++ )
+ {
+ char c = tok.charAt( i );
+ if ( ( i == 0 && !Character.isJavaIdentifierStart( c ) )
+ || ( i > 0 && !Character.isJavaIdentifierPart( c ) ) )
+ {
+ throw new IllegalArgumentException( "Invalid package
name: " + pPackageName );
+ }
+ }
+ }
+ }
+
+ public String getPackageName()
+ {
+ return packageName;
+ }
+
+ public String getClassName()
+ {
+ return className;
+ }
+
+ public boolean isArray()
+ {
+ return false;
+ }
+
+ public JavaQName getInstanceClass()
+ {
+ throw new IllegalStateException( "The class " + this + "is not an
array class." );
+ }
+
+ public boolean isImportable()
+ {
+ return true;
+ }
+
+ public boolean isPrimitive()
+ {
+ return false;
+ }
+
+ public String toString()
+ {
+ String c = getClassName();
+ String p = getPackageName();
+ return p.length() > 0 ? ( p + "." + c ) : c;
+ }
+
+ public String getOuterClassName()
+ {
+ int offset = className.lastIndexOf( '$' );
+ if ( offset == -1 )
+ {
+ return null;
+ }
+ else
+ {
+ return className.substring( 0, offset );
+ }
+ }
+
+ public String getInnerClassName()
+ {
+ int offset = className.lastIndexOf( '$' );
+ if ( offset == -1 )
+ {
+ return className;
+ }
+ else
+ {
+ return className.substring( offset + 1 );
+ }
+ }
+
+ public boolean isInnerClass()
+ {
+ return className.indexOf( '$' ) > 0;
+ }
+
+ public JavaQName getObjectType()
+ {
+ return null;
+ }
+
+ public String getPrimitiveConversionMethod()
+ {
+ return null;
+ }
+ }
+
+ private static class PrimitiveImpl
+ extends StandardImpl
+ {
+ private final JavaQName objectType;
+
+ private final String primitiveConversionMethod;
+
+ public PrimitiveImpl( String pClassName, JavaQName pObjectType, String
pConversionMethod )
+ {
+ super( "", pClassName );
+ objectType = pObjectType;
+ primitiveConversionMethod = pConversionMethod;
+ }
+
+ public boolean isImportable()
+ {
+ return false;
+ }
+
+ public boolean isPrimitive()
+ {
+ return true;
+ }
+
+ public void checkPackageName()
+ {
+ }
+
+ public String toString()
+ {
+ return getClassName();
+ }
+
+ public JavaQName getObjectType()
+ {
+ return objectType;
+ }
+
+ public String getPrimitiveConversionMethod()
+ {
+ return primitiveConversionMethod;
+ }
+ }
+
+ private static class ArrayImpl
+ extends DefaultImpl
+ {
+ private JavaQName qName;
+
+ public ArrayImpl( JavaQName pQName )
+ {
+ qName = pQName;
+ }
+
+ public String getPackageName()
+ {
+ return qName.getPackageName();
+ }
+
+ public String getClassName()
+ {
+ return qName.getClassName();
+ }
+
+ public boolean isArray()
+ {
+ return true;
+ }
+
+ public boolean isImportable()
+ {
+ return false;
+ }
+
+ public boolean isPrimitive()
+ {
+ return false;
+ }
+
+ public JavaQName getInstanceClass()
+ {
+ return qName;
+ }
+
+ public String toString()
+ {
+ return qName.toString() + "[]";
+ }
+
+ public String getOuterClassName()
+ {
+ return null;
+ }
+
+ public String getInnerClassName()
+ {
+ return qName.getClassName();
+ }
+
+ public boolean isInnerClass()
+ {
+ return false;
+ }
+
+ public JavaQName getObjectType()
+ {
+ return null;
+ }
+
+ public String getPrimitiveConversionMethod()
+ {
+ return null;
+ }
+ }
+
+ /** <p>For use in return types or method parameters: The
+ * void type.</p>
+ */
+ public static final JavaQName VOID = new PrimitiveImpl(
void.class.getName(), null, null );
+
+ /** <p>For use in return types or method parameters: The
+ * boolean type.</p>
+ */
+ public static final JavaQName BOOLEAN = new PrimitiveImpl(
boolean.class.getName(), JavaQNameImpl
+ .getInstance( Boolean.class ), "booleanValue()" );
+
+ /** <p>For use in return types or method parameters: The
+ * byte type.</p>
+ */
+ public static final JavaQName BYTE = new PrimitiveImpl(
byte.class.getName(), JavaQNameImpl
+ .getInstance( Byte.class ), "byteValue" );
+
+ /** <p>For use in return types or method parameters: The
+ * short type.</p>
+ */
+ public static final JavaQName SHORT = new PrimitiveImpl(
short.class.getName(), JavaQNameImpl
+ .getInstance( Short.class ), "shortValue" );
+
+ /** <p>For use in return types or method parameters: The
+ * int type.</p>
+ */
+ public static final JavaQName INT = new PrimitiveImpl(
int.class.getName(), JavaQNameImpl
+ .getInstance( Integer.class ), "intValue" );
+
+ /** <p>For use in return types or method parameters: The
+ * long type.</p>
+ */
+ public static final JavaQName LONG = new PrimitiveImpl(
long.class.getName(), JavaQNameImpl
+ .getInstance( Long.class ), "longValue" );
+
+ /** <p>For use in return types or method parameters: The
+ * float type.</p>
+ */
+ public static final JavaQName FLOAT = new PrimitiveImpl(
float.class.getName(), JavaQNameImpl
+ .getInstance( Float.class ), "floatValue" );
+
+ /** <p>For use in return types or method parameters: The
+ * double type.</p>
+ */
+ public static final JavaQName DOUBLE = new PrimitiveImpl(
double.class.getName(), JavaQNameImpl
+ .getInstance( Double.class ), "doubleValue" );
+
+ /** <p>For use in return types or method parameters: The
+ * char type.</p>
+ */
+ public static final JavaQName CHAR = new PrimitiveImpl(
char.class.getName(), JavaQNameImpl
+ .getInstance( Character.class ), "charValue" );
+
+ private static final JavaQName[] primitives = new JavaQName[] {
+ VOID,
+ BOOLEAN,
+ BYTE,
+ SHORT,
+ INT,
+ LONG,
+ FLOAT,
+ DOUBLE,
+ CHAR };
+
+ private static final Class[] primitiveClasses = new Class[] {
+ void.class,
+ boolean.class,
+ byte.class,
+ short.class,
+ int.class,
+ long.class,
+ float.class,
+ double.class,
+ char.class };
+
+ public static JavaQName getInstance( Class pClass )
+ {
+ if ( pClass.isArray() )
+ {
+ return getArray( getInstance( pClass.getComponentType() ) );
+ }
+ if ( pClass.isPrimitive() )
+ {
+ for ( int i = 0; i < primitives.length; i++ )
+ {
+ if ( primitiveClasses[i].equals( pClass ) )
+ {
+ return primitives[i];
+ }
+ }
+ throw new IllegalArgumentException( "Unknown primitive type: " +
pClass.getClass().getName() );
+ }
+ if ( void.class.equals( pClass ) )
+ {
+ return VOID;
+ }
+
+ String name = pClass.getName();
+ int offset = name.lastIndexOf( '.' );
+ if ( offset == -1 )
+ {
+ return getInstance( null, name );
+ }
+ else
+ {
+ return getInstance( name.substring( 0, offset ), name.substring(
offset + 1 ) );
+ }
+ }
+
+ public static JavaQName getInstance( String pPackageName, String
pClassName )
+ {
+ if ( pClassName == null || pClassName.length() == 0 )
+ {
+ throw new NullPointerException( "The class name must not be null
or empty." );
+ }
+ String name;
+ if ( pPackageName == null || pPackageName.length() == 0 )
+ {
+ for ( int i = 0; i < primitives.length; i++ )
+ {
+ if ( primitiveClasses[i].getName().equals( pClassName ) )
+ {
+ return primitives[i];
+ }
+ }
+ name = pClassName;
+ pPackageName = "";
+ }
+ else
+ {
+ name = pPackageName + "." + pClassName;
+ }
+ JavaQName result;
+ synchronized ( names )
+ {
+ result = (JavaQName) names.get( name );
+ if ( result == null )
+ {
+ if ( pClassName.endsWith( "[]" ) )
+ {
+ String instanceClassName = pClassName.substring( 0,
pClassName.length() - 2 );
+ JavaQName instanceClass = getInstance( pPackageName,
instanceClassName );
+ result = new ArrayImpl( instanceClass );
+ }
+ else
+ {
+ result = new StandardImpl( pPackageName, pClassName );
+ }
+ names.put( name, result );
+ }
+ }
+ return result;
+ }
+
+ /** <p>Returns an instance with the given class name.</p>
+ * @param pClassName The class name
+ */
+ public static JavaQName getInstance( String pClassName )
+ {
+ int offset = pClassName.lastIndexOf( '.' );
+ if ( offset == -1 )
+ {
+ return getInstance( null, pClassName );
+ }
+ else
+ {
+ return getInstance( pClassName.substring( 0, offset ),
pClassName.substring( offset + 1 ) );
+ }
+ }
+
+ /** Returns an instance of [EMAIL PROTECTED] JavaQName}, which represents
+ * an array. The array elements are instances of <code>pQName</code>.
+ */
+ public static JavaQName getArray( JavaQName pQName )
+ {
+ String name = pQName.toString() + "[]";
+ JavaQName result;
+ synchronized ( names )
+ {
+ result = (JavaQName) names.get( name );
+ if ( result == null )
+ {
+ result = new ArrayImpl( pQName );
+ names.put( name, result );
+ }
+ }
+ return result;
+ }
+
+ /** <p>Returns the fully qualified name of an inner class of
+ * <code>pQName</code> with the name <code>pInnerClassName</code>.</p>
+ */
+ public static JavaQName getInnerInstance( JavaQName pQName, String
pInnerClassName )
+ {
+ return getInstance( pQName.getPackageName(), pQName.getClassName() +
"$" + pInnerClassName );
+ }
+}
Propchange:
maven/sandbox/maven-shared-java-parser/src/main/java/org/apache/maven/shared/parser/java/JavaQNameImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
maven/sandbox/maven-shared-java-parser/src/main/java/org/apache/maven/shared/parser/java/JavaQNameImpl.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added:
maven/sandbox/maven-shared-java-parser/src/main/java/org/apache/maven/shared/parser/java/JavaSourceObject.java
URL:
http://svn.apache.org/viewvc/maven/sandbox/maven-shared-java-parser/src/main/java/org/apache/maven/shared/parser/java/JavaSourceObject.java?view=auto&rev=483673
==============================================================================
---
maven/sandbox/maven-shared-java-parser/src/main/java/org/apache/maven/shared/parser/java/JavaSourceObject.java
(added)
+++
maven/sandbox/maven-shared-java-parser/src/main/java/org/apache/maven/shared/parser/java/JavaSourceObject.java
Thu Dec 7 13:32:25 2006
@@ -0,0 +1,52 @@
+package org.apache.maven.shared.parser.java;
+
+public class JavaSourceObject
+{
+ private int startLine;
+
+ private int endLine;
+
+ private int startColumn;
+
+ private int endColumn;
+
+ public int getEndColumn()
+ {
+ return endColumn;
+ }
+
+ public void setEndColumn( int endColumn )
+ {
+ this.endColumn = endColumn;
+ }
+
+ public int getEndLine()
+ {
+ return endLine;
+ }
+
+ public void setEndLine( int endLine )
+ {
+ this.endLine = endLine;
+ }
+
+ public int getStartColumn()
+ {
+ return startColumn;
+ }
+
+ public void setStartColumn( int startColumn )
+ {
+ this.startColumn = startColumn;
+ }
+
+ public int getStartLine()
+ {
+ return startLine;
+ }
+
+ public void setStartLine( int startLine )
+ {
+ this.startLine = startLine;
+ }
+}
Propchange:
maven/sandbox/maven-shared-java-parser/src/main/java/org/apache/maven/shared/parser/java/JavaSourceObject.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
maven/sandbox/maven-shared-java-parser/src/main/java/org/apache/maven/shared/parser/java/JavaSourceObject.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added:
maven/sandbox/maven-shared-java-parser/src/test/java/org/apache/maven/shared/parser/java/JavaParserTest.java
URL:
http://svn.apache.org/viewvc/maven/sandbox/maven-shared-java-parser/src/test/java/org/apache/maven/shared/parser/java/JavaParserTest.java?view=auto&rev=483673
==============================================================================
---
maven/sandbox/maven-shared-java-parser/src/test/java/org/apache/maven/shared/parser/java/JavaParserTest.java
(added)
+++
maven/sandbox/maven-shared-java-parser/src/test/java/org/apache/maven/shared/parser/java/JavaParserTest.java
Thu Dec 7 13:32:25 2006
@@ -0,0 +1,67 @@
+package org.apache.maven.shared.parser.java;
+
+import antlr.RecognitionException;
+import antlr.TokenStreamException;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+public class JavaParserTest
+ extends TestCase
+{
+ private File getSampleFile( int idx )
+ {
+ return new File( "src/test/samples/sample-" + idx + ".java" );
+ }
+
+ public void testParseSimple()
+ throws RecognitionException, TokenStreamException,
FileNotFoundException
+ {
+ File sample = getSampleFile( 1 );
+ JavaParser parser = new JavaParser();
+ List parsed = parser.parse( sample );
+ assertNotNull( parsed );
+ assertEquals( 1, parsed.size() );
+
+ // TODO: No real meat here (yet)
+ }
+
+ public void testParseSimpleWithImport()
+ throws RecognitionException, TokenStreamException,
FileNotFoundException
+ {
+ File sample = getSampleFile( 2 );
+ JavaParser parser = new JavaParser();
+ List parsed = parser.parse( sample );
+ assertNotNull( parsed );
+ assertEquals( 1, parsed.size() );
+
+ // TODO: No real meat here (yet)
+ }
+
+ public void testParseImportAndJavadoc()
+ throws RecognitionException, TokenStreamException,
FileNotFoundException
+ {
+ File sample = getSampleFile( 3 );
+ JavaParser parser = new JavaParser();
+ List parsed = parser.parse( sample );
+ assertNotNull( parsed );
+ assertEquals( 1, parsed.size() );
+
+ // TODO: No real meat here (yet)
+ }
+
+ public void testParseMultipleComments()
+ throws RecognitionException, TokenStreamException,
FileNotFoundException
+ {
+ File sample = getSampleFile( 5 );
+ JavaParser parser = new JavaParser();
+ List parsed = parser.parse( sample );
+ assertNotNull( parsed );
+ assertEquals( 1, parsed.size() );
+
+ // TODO: No real meat here (yet)
+ }
+}
Propchange:
maven/sandbox/maven-shared-java-parser/src/test/java/org/apache/maven/shared/parser/java/JavaParserTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
maven/sandbox/maven-shared-java-parser/src/test/java/org/apache/maven/shared/parser/java/JavaParserTest.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/sandbox/maven-shared-java-parser/src/test/samples/sample-1.java
URL:
http://svn.apache.org/viewvc/maven/sandbox/maven-shared-java-parser/src/test/samples/sample-1.java?view=auto&rev=483673
==============================================================================
--- maven/sandbox/maven-shared-java-parser/src/test/samples/sample-1.java
(added)
+++ maven/sandbox/maven-shared-java-parser/src/test/samples/sample-1.java Thu
Dec 7 13:32:25 2006
@@ -0,0 +1,9 @@
+package foo;
+
+public class Foo
+{
+ public static void main( String args[] )
+ {
+ System.out.println( "Hello World." );
+ }
+}
\ No newline at end of file
Propchange:
maven/sandbox/maven-shared-java-parser/src/test/samples/sample-1.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
maven/sandbox/maven-shared-java-parser/src/test/samples/sample-1.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/sandbox/maven-shared-java-parser/src/test/samples/sample-2.java
URL:
http://svn.apache.org/viewvc/maven/sandbox/maven-shared-java-parser/src/test/samples/sample-2.java?view=auto&rev=483673
==============================================================================
--- maven/sandbox/maven-shared-java-parser/src/test/samples/sample-2.java
(added)
+++ maven/sandbox/maven-shared-java-parser/src/test/samples/sample-2.java Thu
Dec 7 13:32:25 2006
@@ -0,0 +1,11 @@
+package foo;
+
+import org.bar;
+
+public class Foo
+{
+ public static void main(String args[])
+ {
+ System.out.println("Foo.");
+ }
+}
Propchange:
maven/sandbox/maven-shared-java-parser/src/test/samples/sample-2.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
maven/sandbox/maven-shared-java-parser/src/test/samples/sample-2.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/sandbox/maven-shared-java-parser/src/test/samples/sample-3.java
URL:
http://svn.apache.org/viewvc/maven/sandbox/maven-shared-java-parser/src/test/samples/sample-3.java?view=auto&rev=483673
==============================================================================
--- maven/sandbox/maven-shared-java-parser/src/test/samples/sample-3.java
(added)
+++ maven/sandbox/maven-shared-java-parser/src/test/samples/sample-3.java Thu
Dec 7 13:32:25 2006
@@ -0,0 +1,14 @@
+package foo;
+
+import org.bar;
+
+/**
+ * A Class Comment.
+ */
+public class Foo
+{
+ public static void main(String args[])
+ {
+ System.out.println("Foo.");
+ }
+}
Propchange:
maven/sandbox/maven-shared-java-parser/src/test/samples/sample-3.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
maven/sandbox/maven-shared-java-parser/src/test/samples/sample-3.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/sandbox/maven-shared-java-parser/src/test/samples/sample-4.java
URL:
http://svn.apache.org/viewvc/maven/sandbox/maven-shared-java-parser/src/test/samples/sample-4.java?view=auto&rev=483673
==============================================================================
--- maven/sandbox/maven-shared-java-parser/src/test/samples/sample-4.java
(added)
+++ maven/sandbox/maven-shared-java-parser/src/test/samples/sample-4.java Thu
Dec 7 13:32:25 2006
@@ -0,0 +1,23 @@
+package foo;
+
+/**
+ * A Class Comment.
+ */
+public class Foo
+{
+ public static void main(String args[])
+ {
+ (new Foo()).go();
+ }
+
+ /**
+ * A method javadoc with the word import in it to confuse the parser.
+ * import this.
+ * import that;
+ * this java source should not have a normal import line.
+ */
+ public void go()
+ {
+ System.out.println("Foo.");
+ }
+}
Propchange:
maven/sandbox/maven-shared-java-parser/src/test/samples/sample-4.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
maven/sandbox/maven-shared-java-parser/src/test/samples/sample-4.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/sandbox/maven-shared-java-parser/src/test/samples/sample-5.java
URL:
http://svn.apache.org/viewvc/maven/sandbox/maven-shared-java-parser/src/test/samples/sample-5.java?view=auto&rev=483673
==============================================================================
--- maven/sandbox/maven-shared-java-parser/src/test/samples/sample-5.java
(added)
+++ maven/sandbox/maven-shared-java-parser/src/test/samples/sample-5.java Thu
Dec 7 13:32:25 2006
@@ -0,0 +1,40 @@
+package foo;
+
+/* Look! And old comment that exists before the import statements.
+ */
+
+import org.bar.Bar;
+
+/* a normal multiline that exists before the class definition. */
+
+/**
+ * Javadoc for class Foo.
+ */
+public class Foo
+{
+ /**
+ * Javadoc for Class Field MESSAGE.
+ */
+ private static final String MESSAGE = "Foo.";
+
+ public static void main( String args[] )
+ {
+ ( new Foo() ).go();
+ }
+
+ /**
+ * Javadoc for constructor.
+ */
+ public Foo()
+ {
+ // Ignore
+ }
+
+ /**
+ * Javadoc for go()
+ */
+ public void go()
+ {
+ System.out.println( "Hello " + MESSAGE + "." );
+ }
+}
Propchange:
maven/sandbox/maven-shared-java-parser/src/test/samples/sample-5.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
maven/sandbox/maven-shared-java-parser/src/test/samples/sample-5.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"