Initial checkin
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..eb5a316
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+target
diff --git a/org.springframework.build.aws.maven/.classpath b/org.springframework.build.aws.maven/.classpath
new file mode 100644
index 0000000..49140ee
--- /dev/null
+++ b/org.springframework.build.aws.maven/.classpath
@@ -0,0 +1,13 @@
+<classpath>
+ <classpathentry kind="src" path="src/main/java"/>
+ <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
+ <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
+ <classpathentry kind="output" path="target/classes"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="var" path="M2_REPO/commons-httpclient/commons-httpclient/3.1/commons-httpclient-3.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar" sourcepath="M2_REPO/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/commons-codec/commons-codec/1.2/commons-codec-1.2.jar"/>
+ <classpathentry kind="var" path="M2_REPO/net/java/dev/jets3t/jets3t/0.5.1-20080115/jets3t-0.6.0.jar" sourcepath="M2_REPO/net/java/dev/jets3t/jets3t/0.5.1-20080115/jets3t-0.6.0-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/maven/wagon/wagon-provider-api/1.0-beta-2/wagon-provider-api-1.0-beta-2.jar" sourcepath="M2_REPO/org/apache/maven/wagon/wagon-provider-api/1.0-beta-2/wagon-provider-api-1.0-beta-2-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/codehaus/plexus/plexus-utils/1.0.4/plexus-utils-1.0.4.jar" sourcepath="M2_REPO/org/codehaus/plexus/plexus-utils/1.0.4/plexus-utils-1.0.4-sources.jar"/>
+</classpath>
\ No newline at end of file
diff --git a/org.springframework.build.aws.maven/.project b/org.springframework.build.aws.maven/.project
new file mode 100644
index 0000000..23247a8
--- /dev/null
+++ b/org.springframework.build.aws.maven/.project
@@ -0,0 +1,13 @@
+<projectDescription>
+ <name>org.springframework.build.aws.maven</name>
+ <comment>Standard Maven wagon support for s3:// urls</comment>
+ <projects/>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
\ No newline at end of file
diff --git a/org.springframework.build.aws.maven/.settings/org.eclipse.jdt.core.prefs b/org.springframework.build.aws.maven/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..3a378cf
--- /dev/null
+++ b/org.springframework.build.aws.maven/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,259 @@
+#Tue Nov 13 08:43:58 EST 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=do not insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.springframework.build.aws.maven/.settings/org.eclipse.jdt.ui.prefs b/org.springframework.build.aws.maven/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..c9e3c77
--- /dev/null
+++ b/org.springframework.build.aws.maven/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,4 @@
+#Tue Nov 13 08:43:58 EST 2007
+eclipse.preferences.version=1
+formatter_profile=_Spring
+formatter_settings_version=11
diff --git a/org.springframework.build.aws.maven/pom.xml b/org.springframework.build.aws.maven/pom.xml
new file mode 100644
index 0000000..711e803
--- /dev/null
+++ b/org.springframework.build.aws.maven/pom.xml
@@ -0,0 +1,73 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.springframework.build.aws</groupId>
+ <artifactId>org.springframework.build.aws.maven</artifactId>
+ <packaging>jar</packaging>
+ <name>Amazon Web Services Maven Wagon Support</name>
+ <version>2.0.1.BUILD-SNAPSHOT</version>
+ <description>
+ Standard Maven wagon support for s3:// urls
+ </description>
+ <url>http://www.springframework.org</url>
+ <inceptionYear>2007</inceptionYear>
+ <licenses>
+ <license>
+ <name>Apache License, Version 2.0</name>
+ <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+ <distribution>repo</distribution>
+ </license>
+ </licenses>
+ <scm>
+ <connection>scm:svn:https://springframework.svn.sourceforge.net/svnroot/springframework/spring-aws/trunk</connection>
+ <developerConnection>scm:svn:https://springframework.svn.sourceforge.net/svnroot/springframework/spring-aws/trunk</developerConnection>
+ <url>http://fisheye3.cenqua.com/browse/springframework/spring-aws/trunk</url>
+ </scm>
+ <organization>
+ <name>Spring Framework</name>
+ <url>http://www.springframework.org</url>
+ </organization>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.5</source>
+ <target>1.5</target>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ <dependencies>
+ <dependency>
+ <groupId>commons-httpclient</groupId>
+ <artifactId>commons-httpclient</artifactId>
+ <version>3.1</version>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
+ <groupId>net.java.dev.jets3t</groupId>
+ <artifactId>jets3t</artifactId>
+ <version>0.6.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven.wagon</groupId>
+ <artifactId>wagon-provider-api</artifactId>
+ <version>1.0-beta-2</version>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
+ <distributionManagement>
+ <repository>
+ <id>spring-milestone</id>
+ <name>Spring Milestone Repository</name>
+ <url>s3://maven.springframework.org/snapshot</url>
+ </repository>
+ <snapshotRepository>
+ <id>spring-snapshot</id>
+ <name>Spring Snapshot Repository</name>
+ <url>s3://maven.springframework.org/snapshot</url>
+ </snapshotRepository>
+ </distributionManagement>
+</project>
\ No newline at end of file
diff --git a/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/AbstractWagon.java b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/AbstractWagon.java
new file mode 100644
index 0000000..1e1c760
--- /dev/null
+++ b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/AbstractWagon.java
@@ -0,0 +1,364 @@
+/*
+ * Copyright 2004-2007 the original author or authors.
+ *
+ * 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.springframework.aws.maven;
+
+import org.apache.maven.wagon.ConnectionException;
+import org.apache.maven.wagon.ResourceDoesNotExistException;
+import org.apache.maven.wagon.TransferFailedException;
+import org.apache.maven.wagon.Wagon;
+import org.apache.maven.wagon.authentication.AuthenticationException;
+import org.apache.maven.wagon.authentication.AuthenticationInfo;
+import org.apache.maven.wagon.authorization.AuthorizationException;
+import org.apache.maven.wagon.events.SessionListener;
+import org.apache.maven.wagon.events.TransferEvent;
+import org.apache.maven.wagon.events.TransferListener;
+import org.apache.maven.wagon.proxy.ProxyInfo;
+import org.apache.maven.wagon.repository.Repository;
+import org.apache.maven.wagon.resource.Resource;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * An abstract implementation of the Wagon interface. This implementation
+ * manages listener and other common behaviors.
+ *
+ * @author Ben Hale
+ * @since 1.1
+ */
+public abstract class AbstractWagon implements Wagon {
+
+ private boolean interactive;
+
+ private Repository repository;
+
+ private boolean supportsDirectoryCopy;
+
+ private SessionListenerSupport sessionListeners = new SessionListenerSupport(this);
+
+ private TransferListenerSupport transferListeners = new TransferListenerSupport(this);
+
+ protected AbstractWagon(boolean supportsDirectoryCopy) {
+ this.supportsDirectoryCopy = supportsDirectoryCopy;
+ }
+
+ public final void addSessionListener(SessionListener listener) {
+ sessionListeners.addListener(listener);
+ }
+
+ protected final SessionListenerSupport getSessionListeners() {
+ return sessionListeners;
+ }
+
+ public final boolean hasSessionListener(SessionListener listener) {
+ return sessionListeners.hasListener(listener);
+ }
+
+ public final void removeSessionListener(SessionListener listener) {
+ sessionListeners.removeListener(listener);
+ }
+
+ public final void addTransferListener(TransferListener listener) {
+ transferListeners.addListener(listener);
+ }
+
+ protected final TransferListenerSupport getTransferListeners() {
+ return transferListeners;
+ }
+
+ public final boolean hasTransferListener(TransferListener listener) {
+ return transferListeners.hasListener(listener);
+ }
+
+ public final void removeTransferListener(TransferListener listener) {
+ transferListeners.removeListener(listener);
+ }
+
+ public final Repository getRepository() {
+ return repository;
+ }
+
+ public final boolean isInteractive() {
+ return interactive;
+ }
+
+ public final void setInteractive(boolean interactive) {
+ this.interactive = interactive;
+ }
+
+ public final void connect(Repository source) throws ConnectionException, AuthenticationException {
+ connect(source, null, null);
+ }
+
+ public final void connect(Repository source, ProxyInfo proxyInfo) throws ConnectionException,
+ AuthenticationException {
+ connect(source, null, proxyInfo);
+ }
+
+ public final void connect(Repository source, AuthenticationInfo authenticationInfo) throws ConnectionException,
+ AuthenticationException {
+ connect(source, authenticationInfo, null);
+ }
+
+ public final void connect(Repository source, AuthenticationInfo authenticationInfo, ProxyInfo proxyInfo)
+ throws ConnectionException, AuthenticationException {
+ repository = source;
+ sessionListeners.fireSessionOpening();
+ try {
+ connectToRepository(source, authenticationInfo, proxyInfo);
+ }
+ catch (ConnectionException e) {
+ sessionListeners.fireSessionConnectionRefused();
+ throw e;
+ }
+ catch (AuthenticationException e) {
+ sessionListeners.fireSessionConnectionRefused();
+ throw e;
+ }
+ catch (Exception e) {
+ sessionListeners.fireSessionConnectionRefused();
+ throw new ConnectionException("Could not connect to repository", e);
+ }
+ sessionListeners.fireSessionLoggedIn();
+ sessionListeners.fireSessionOpened();
+ }
+
+ public final void disconnect() throws ConnectionException {
+ sessionListeners.fireSessionDisconnecting();
+ try {
+ disconnectFromRepository();
+ }
+ catch (ConnectionException e) {
+ sessionListeners.fireSessionConnectionRefused();
+ throw e;
+ }
+ catch (Exception e) {
+ sessionListeners.fireSessionConnectionRefused();
+ throw new ConnectionException("Could not disconnect from repository", e);
+ }
+ sessionListeners.fireSessionLoggedOff();
+ sessionListeners.fireSessionDisconnected();
+ }
+
+ public final void get(String resourceName, File destination) throws TransferFailedException,
+ ResourceDoesNotExistException, AuthorizationException {
+ Resource resource = new Resource(resourceName);
+ transferListeners.fireTransferInitiated(resource, TransferEvent.REQUEST_GET);
+ transferListeners.fireTransferStarted(resource, TransferEvent.REQUEST_GET);
+
+ try {
+ getResource(resourceName, destination, new TransferProgress(resource, TransferEvent.REQUEST_GET,
+ transferListeners));
+ transferListeners.fireTransferCompleted(resource, TransferEvent.REQUEST_GET);
+ }
+ catch (TransferFailedException e) {
+ throw e;
+ }
+ catch (ResourceDoesNotExistException e) {
+ throw e;
+ }
+ catch (AuthorizationException e) {
+ throw e;
+ }
+ catch (Exception e) {
+ transferListeners.fireTransferError(resource, TransferEvent.REQUEST_GET, e);
+ throw new TransferFailedException("Transfer of resource " + destination + "failed", e);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public final List getFileList(String destinationDirectory) throws TransferFailedException,
+ ResourceDoesNotExistException, AuthorizationException {
+ try {
+ return listDirectory(destinationDirectory);
+ }
+ catch (TransferFailedException e) {
+ throw e;
+ }
+ catch (ResourceDoesNotExistException e) {
+ throw e;
+ }
+ catch (AuthorizationException e) {
+ throw e;
+ }
+ catch (Exception e) {
+ sessionListeners.fireSessionError(e);
+ throw new TransferFailedException("Listing of directory " + destinationDirectory + "failed", e);
+ }
+ }
+
+ public final boolean getIfNewer(String resourceName, File destination, long timestamp)
+ throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException {
+ Resource resource = new Resource(resourceName);
+ try {
+ if (isRemoteResourceNewer(resourceName, timestamp)) {
+ get(resourceName, destination);
+ return true;
+ }
+ else {
+ return false;
+ }
+ }
+ catch (TransferFailedException e) {
+ throw e;
+ }
+ catch (ResourceDoesNotExistException e) {
+ throw e;
+ }
+ catch (AuthorizationException e) {
+ throw e;
+ }
+ catch (Exception e) {
+ transferListeners.fireTransferError(resource, TransferEvent.REQUEST_GET, e);
+ throw new TransferFailedException("Transfer of resource " + destination + "failed", e);
+ }
+ }
+
+ public final void openConnection() throws ConnectionException, AuthenticationException {
+ // Nothing to do here (never called by the wagon manager)
+ }
+
+ public final void put(File source, String destination) throws TransferFailedException,
+ ResourceDoesNotExistException, AuthorizationException {
+ Resource resource = new Resource(destination);
+ transferListeners.fireTransferInitiated(resource, TransferEvent.REQUEST_PUT);
+ transferListeners.fireTransferStarted(resource, TransferEvent.REQUEST_PUT);
+
+ try {
+ putResource(source, destination, new TransferProgress(resource, TransferEvent.REQUEST_PUT,
+ transferListeners));
+ transferListeners.fireTransferCompleted(resource, TransferEvent.REQUEST_PUT);
+ }
+ catch (TransferFailedException e) {
+ throw e;
+ }
+ catch (ResourceDoesNotExistException e) {
+ throw e;
+ }
+ catch (AuthorizationException e) {
+ throw e;
+ }
+ catch (Exception e) {
+ transferListeners.fireTransferError(resource, TransferEvent.REQUEST_PUT, e);
+ throw new TransferFailedException("Transfer of resource " + destination + "failed", e);
+ }
+ }
+
+ public final void putDirectory(File sourceDirectory, String destinationDirectory) throws TransferFailedException,
+ ResourceDoesNotExistException, AuthorizationException {
+ for (File f : sourceDirectory.listFiles()) {
+ put(f, destinationDirectory + "/" + f.getName());
+ }
+ }
+
+ public final boolean resourceExists(String resourceName) throws TransferFailedException, AuthorizationException {
+ try {
+ return doesRemoteResourceExist(resourceName);
+ }
+ catch (TransferFailedException e) {
+ throw e;
+ }
+ catch (AuthorizationException e) {
+ throw e;
+ }
+ catch (Exception e) {
+ sessionListeners.fireSessionError(e);
+ throw new TransferFailedException("Listing of resource " + resourceName + "failed", e);
+ }
+ }
+
+ public final boolean supportsDirectoryCopy() {
+ return supportsDirectoryCopy;
+ }
+
+ /**
+ * Subclass must implement with specific connection behavior
+ *
+ * @param source The repository connection information
+ * @param authenticationInfo Authentication information, if any
+ * @param proxyInfo Proxy information, if any
+ * @throws Exception Implementations can throw any exception and it will be
+ * handled by the base class
+ */
+ protected abstract void connectToRepository(Repository source, AuthenticationInfo authenticationInfo,
+ ProxyInfo proxyInfo) throws Exception;
+
+ /**
+ * Subclass must implement with specific detection behavior
+ *
+ * @param resourceName The remote resource to detect
+ * @return true if the remote resource exists
+ * @throws Exception Implementations can throw any exception and it will be
+ * handled by the base class
+ */
+ protected abstract boolean doesRemoteResourceExist(String resourceName) throws Exception;
+
+ /**
+ * Subclasses must implement with specific disconnection behavior
+ *
+ * @throws Exception Implementations can throw any exception and it will be
+ * handled by the base class
+ */
+ protected abstract void disconnectFromRepository() throws Exception;
+
+ /**
+ * Subclass must implement with specific get behavior
+ *
+ * @param resourceName The name of the remote resource to read
+ * @param destination The local file to write to
+ * @param progress A progress notifier for the upload. It must be used or
+ * hashes will not be calculated correctly
+ * @throws Exception Implementations can throw any exception and it will be
+ * handled by the base class
+ */
+ protected abstract void getResource(String resourceName, File destination, TransferProgress progress)
+ throws Exception;
+
+ /**
+ * Subclass must implement with newer detection behavior
+ *
+ * @param resourceName The name of the resource being compared
+ * @param timestamp The timestamp to compare against
+ * @return true if the current version of the resource is newer than the
+ * timestamp
+ * @throws Exception Implementations can throw any exception and it will be
+ * handled by the base class
+ */
+ protected abstract boolean isRemoteResourceNewer(String resourceName, long timestamp) throws Exception;
+
+ /**
+ * Subclass must implement with specific directory listing behavior
+ *
+ * @param directory The directory to list files in
+ * @return A collection of file names
+ * @throws Exception Implementations can throw any exception and it will be
+ * handled by the base class
+ */
+ protected abstract List<String> listDirectory(String directory) throws Exception;
+
+ /**
+ * Subclasses must implement with specific put behavior
+ *
+ * @param source The local source file to read from
+ * @param destination The name of the remote resource to write to
+ * @param progress A progress notifier for the upload. It must be used or
+ * hashes will not be calculated correctly
+ * @throws Exception Implementations can throw any exception and it will be
+ * handled by the base class
+ */
+ protected abstract void putResource(File source, String destination, TransferProgress progress) throws Exception;
+
+}
diff --git a/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/SessionListenerSupport.java b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/SessionListenerSupport.java
new file mode 100644
index 0000000..5de3f9c
--- /dev/null
+++ b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/SessionListenerSupport.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2004-2007 the original author or authors.
+ *
+ * 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.springframework.aws.maven;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.maven.wagon.Wagon;
+import org.apache.maven.wagon.events.SessionEvent;
+import org.apache.maven.wagon.events.SessionListener;
+
+/**
+ * Support for sending messages to Maven session listeners. Automates the
+ * collection of listeners and the iteration over that collection when an event
+ * is fired.
+ *
+ * @author Ben Hale
+ */
+class SessionListenerSupport {
+
+ private Wagon wagon;
+
+ private Set<SessionListener> listeners = new HashSet<SessionListener>();
+
+ /**
+ * Creates a new instance
+ * @param wagon The wagon that events will come from
+ */
+ public SessionListenerSupport(Wagon wagon) {
+ this.wagon = wagon;
+ }
+
+ /**
+ * Adds a listener to the collection
+ * @param listener The listener to add
+ */
+ public void addListener(SessionListener listener) {
+ listeners.add(listener);
+ }
+
+ /**
+ * Removes a listener from the collection
+ * @param listener The listener to remove
+ */
+ public void removeListener(SessionListener listener) {
+ listeners.remove(listener);
+ }
+
+ /**
+ * Whether the collection already contains a listener
+ * @param listener The listener to check for
+ * @return Whether the collection contains a listener
+ */
+ public boolean hasListener(SessionListener listener) {
+ return listeners.contains(listener);
+ }
+
+ /**
+ * Sends a session opening event to all listeners
+ * @see SessionEvent#SESSION_OPENING
+ */
+ public void fireSessionOpening() {
+ SessionEvent event = new SessionEvent(wagon, SessionEvent.SESSION_OPENING);
+ for (SessionListener listener : listeners) {
+ listener.sessionOpening(event);
+ }
+ }
+
+ /**
+ * Sends a session opened event to all listeners
+ * @see SessionEvent#SESSION_OPENED
+ */
+ public void fireSessionOpened() {
+ SessionEvent event = new SessionEvent(wagon, SessionEvent.SESSION_OPENED);
+ for (SessionListener listener : listeners) {
+ listener.sessionOpened(event);
+ }
+ }
+
+ /**
+ * Sends a session disconnecting event to all listeners
+ * @see SessionEvent#SESSION_DISCONNECTING
+ */
+ public void fireSessionDisconnecting() {
+ SessionEvent event = new SessionEvent(wagon, SessionEvent.SESSION_DISCONNECTING);
+ for (SessionListener listener : listeners) {
+ listener.sessionDisconnecting(event);
+ }
+ }
+
+ /**
+ * Sends a session disconnected event to all listeners
+ * @see SessionEvent#SESSION_DISCONNECTED
+ */
+ public void fireSessionDisconnected() {
+ SessionEvent event = new SessionEvent(wagon, SessionEvent.SESSION_DISCONNECTED);
+ for (SessionListener listener : listeners) {
+ listener.sessionDisconnected(event);
+ }
+ }
+
+ /**
+ * Sends a session connection refused event to all listeners
+ * @see SessionEvent#SESSION_CONNECTION_REFUSED
+ */
+ public void fireSessionConnectionRefused() {
+ SessionEvent event = new SessionEvent(wagon, SessionEvent.SESSION_CONNECTION_REFUSED);
+ for (SessionListener listener : listeners) {
+ listener.sessionConnectionRefused(event);
+ }
+ }
+
+ /**
+ * Sends a session logged in event to all listeners
+ * @see SessionEvent#SESSION_LOGGED_IN
+ */
+ public void fireSessionLoggedIn() {
+ SessionEvent event = new SessionEvent(wagon, SessionEvent.SESSION_LOGGED_IN);
+ for (SessionListener listener : listeners) {
+ listener.sessionLoggedIn(event);
+ }
+ }
+
+ /**
+ * Sends a session logged off event to all listeners
+ * @see SessionEvent#SESSION_LOGGED_OFF
+ */
+ public void fireSessionLoggedOff() {
+ SessionEvent event = new SessionEvent(wagon, SessionEvent.SESSION_LOGGED_OFF);
+ for (SessionListener listener : listeners) {
+ listener.sessionLoggedOff(event);
+ }
+ }
+
+ /**
+ * Sends a session error event to all listeners
+ * @param e The session error
+ */
+ public void fireSessionError(Exception e) {
+ SessionEvent event = new SessionEvent(wagon, e);
+ for (SessionListener listener : listeners) {
+ listener.sessionError(event);
+ }
+ }
+}
diff --git a/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/SimpleStorageServiceWagon.java b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/SimpleStorageServiceWagon.java
new file mode 100644
index 0000000..6fb37e0
--- /dev/null
+++ b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/SimpleStorageServiceWagon.java
@@ -0,0 +1,214 @@
+/*
+ * Copyright 2004-2007 the original author or authors.
+ *
+ * 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.springframework.aws.maven;
+
+import org.apache.maven.wagon.ResourceDoesNotExistException;
+import org.apache.maven.wagon.authentication.AuthenticationException;
+import org.apache.maven.wagon.authentication.AuthenticationInfo;
+import org.apache.maven.wagon.proxy.ProxyInfo;
+import org.apache.maven.wagon.repository.Repository;
+import org.jets3t.service.S3Service;
+import org.jets3t.service.S3ServiceException;
+import org.jets3t.service.acl.AccessControlList;
+import org.jets3t.service.impl.rest.httpclient.RestS3Service;
+import org.jets3t.service.model.S3Bucket;
+import org.jets3t.service.model.S3Object;
+import org.jets3t.service.security.AWSCredentials;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * An implementation of the Maven Wagon interface that allows you to access the
+ * Amazon S3 service. URLs that reference the S3 service should be in the form
+ * of <code>s3://bucket.name</code>. As an example
+ * <code>s3://static.springframework.org</code> would put files into the
+ * <code>static.springframework.org</code> bucket on the S3 service. <p/> This
+ * implementation uses the <code>username</code> and <code>passphrase</code>
+ * portions of the server authentication metadata for credentials.
+ *
+ * @author Ben Hale
+ */
+public class SimpleStorageServiceWagon extends AbstractWagon {
+
+ private S3Service service;
+
+ private S3Bucket bucket;
+
+ private String basedir;
+
+ public SimpleStorageServiceWagon() {
+ super(false);
+ }
+
+ protected void connectToRepository(Repository source, AuthenticationInfo authenticationInfo, ProxyInfo proxyInfo)
+ throws AuthenticationException {
+ try {
+ service = new RestS3Service(getCredentials(authenticationInfo));
+ }
+ catch (S3ServiceException e) {
+ throw new AuthenticationException("Cannot authenticate with current credentials", e);
+ }
+ bucket = new S3Bucket(source.getHost());
+ basedir = getBaseDir(source);
+ }
+
+ protected boolean doesRemoteResourceExist(String resourceName) {
+ try {
+ service.getObjectDetails(bucket, basedir + resourceName);
+ }
+ catch (S3ServiceException e) {
+ return false;
+ }
+ return true;
+ }
+
+ protected void disconnectFromRepository() {
+ // Nothing to do for S3
+ }
+
+ protected void getResource(String resourceName, File destination, TransferProgress progress)
+ throws ResourceDoesNotExistException, S3ServiceException, IOException {
+ S3Object object;
+ try {
+ object = service.getObject(bucket, basedir + resourceName);
+ }
+ catch (S3ServiceException e) {
+ throw new ResourceDoesNotExistException("Resource " + resourceName + " does not exist in the repository", e);
+ }
+
+ if(!destination.getParentFile().exists()) {
+ destination.getParentFile().mkdirs();
+ }
+
+ InputStream in = null;
+ OutputStream out = null;
+ try {
+ in = object.getDataInputStream();
+ out = new TransferProgressFileOutputStream(destination, progress);
+ byte[] buffer = new byte[1024];
+ int length;
+ while ((length = in.read(buffer)) != -1) {
+ out.write(buffer, 0, length);
+ }
+ }
+ finally {
+ if (in != null) {
+ try {
+ in.close();
+ }
+ catch (IOException e) {
+ // Nothing possible at this point
+ }
+ }
+ if (out != null) {
+ try {
+ out.close();
+ }
+ catch (IOException e) {
+ // Nothing possible at this point
+ }
+ }
+ }
+ }
+
+ protected boolean isRemoteResourceNewer(String resourceName, long timestamp) throws S3ServiceException {
+ S3Object object = service.getObjectDetails(bucket, basedir + resourceName);
+ return object.getLastModifiedDate().compareTo(new Date(timestamp)) < 0;
+ }
+
+ protected List<String> listDirectory(String directory) throws Exception {
+ S3Object[] objects = service.listObjects(bucket, basedir + directory, "");
+ List<String> fileNames = new ArrayList<String>(objects.length);
+ for (S3Object object : objects) {
+ fileNames.add(object.getKey());
+ }
+ return fileNames;
+ }
+
+ protected void putResource(File source, String destination, TransferProgress progress) throws S3ServiceException,
+ IOException {
+ buildDestinationPath(getDestinationPath(destination));
+ S3Object object = new S3Object(basedir + destination);
+ object.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
+ object.setDataInputFile(source);
+ object.setContentLength(source.length());
+
+ InputStream in = null;
+ try {
+ service.putObject(bucket, object);
+
+ in = new FileInputStream(source);
+ byte[] buffer = new byte[1024];
+ int length;
+ while ((length = in.read(buffer)) != -1) {
+ progress.notify(buffer, length);
+ }
+ }
+ finally {
+ if (in != null) {
+ try {
+ in.close();
+ }
+ catch (IOException e) {
+ // Nothing possible at this point
+ }
+ }
+ }
+ }
+
+ private void buildDestinationPath(String destination) throws S3ServiceException {
+ S3Object object = new S3Object(basedir + destination + "/");
+ object.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
+ object.setContentLength(0);
+ service.putObject(bucket, object);
+ int index = destination.lastIndexOf('/');
+ if (index != -1) {
+ buildDestinationPath(destination.substring(0, index));
+ }
+ }
+
+ private String getDestinationPath(String destination) {
+ return destination.substring(0, destination.lastIndexOf('/'));
+ }
+
+ private String getBaseDir(Repository source) {
+ StringBuilder sb = new StringBuilder(source.getBasedir());
+ sb.deleteCharAt(0);
+ if (sb.charAt(sb.length() - 1) != '/') {
+ sb.append('/');
+ }
+ return sb.toString();
+ }
+
+ private AWSCredentials getCredentials(AuthenticationInfo authenticationInfo) throws AuthenticationException {
+ if (authenticationInfo == null) {
+ return null;
+ }
+ String accessKey = authenticationInfo.getUserName();
+ String secretKey = authenticationInfo.getPassphrase();
+ if (accessKey == null || secretKey == null) {
+ throw new AuthenticationException("S3 requires a username and passphrase to be set");
+ }
+ return new AWSCredentials(accessKey, secretKey);
+ }
+}
diff --git a/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferListenerSupport.java b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferListenerSupport.java
new file mode 100644
index 0000000..7ed1eff
--- /dev/null
+++ b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferListenerSupport.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2004-2007 the original author or authors.
+ *
+ * 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.springframework.aws.maven;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.maven.wagon.Wagon;
+import org.apache.maven.wagon.events.TransferEvent;
+import org.apache.maven.wagon.events.TransferListener;
+import org.apache.maven.wagon.resource.Resource;
+
+/**
+ * Support for sending messages to Maven transfer listeners. Automates the
+ * collection of listeners and the iteration over that collection when an event
+ * is fired.
+ *
+ * @author Ben Hale
+ */
+class TransferListenerSupport {
+
+ private Wagon wagon;
+
+ private Set<TransferListener> listeners = new HashSet<TransferListener>();
+
+ /**
+ * Creates a new instance
+ * @param wagon The wagon that events will come from
+ */
+ public TransferListenerSupport(Wagon wagon) {
+ this.wagon = wagon;
+ }
+
+ /**
+ * Adds a listener to the collection
+ * @param listener The listener to add
+ */
+ public void addListener(TransferListener listener) {
+ listeners.add(listener);
+ }
+
+ /**
+ * Removes a listener from the collection
+ * @param listener The listener to remove
+ */
+ public void removeListener(TransferListener listener) {
+ listeners.remove(listener);
+ }
+
+ /**
+ * Whether the collection already contains a listener
+ * @param listener The listener to check for
+ * @return whether the collection contains the listener
+ */
+ public boolean hasListener(TransferListener listener) {
+ return listeners.contains(listener);
+ }
+
+ /**
+ * Sends a transfer initated event to all listeners
+ * @param resource The resource being transfered
+ * @param requestType GET or PUT request
+ * @see TransferEvent#TRANSFER_INITIATED
+ */
+ public void fireTransferInitiated(Resource resource, int requestType) {
+ TransferEvent event = new TransferEvent(wagon, resource, TransferEvent.TRANSFER_INITIATED, requestType);
+ for (TransferListener listener : listeners) {
+ listener.transferInitiated(event);
+ }
+ }
+
+ /**
+ * Sends a transfer started event to all listeners
+ * @param resource The resource being transfered
+ * @param requestType GET or PUT request
+ * @see TransferEvent#TRANSFER_STARTED
+ */
+ public void fireTransferStarted(Resource resource, int requestType) {
+ TransferEvent event = new TransferEvent(wagon, resource, TransferEvent.TRANSFER_STARTED, requestType);
+ for (TransferListener listener : listeners) {
+ listener.transferStarted(event);
+ }
+ }
+
+ public void fireTransferProgress(Resource resource, int requestType, byte[] buffer, int length) {
+ TransferEvent event = new TransferEvent(wagon, resource, TransferEvent.TRANSFER_PROGRESS, requestType);
+ for (TransferListener listener : listeners) {
+ listener.transferProgress(event, buffer, length);
+ }
+ }
+
+ /**
+ * Sends a transfer completed event to all listeners
+ * @param resource The resource being transfered
+ * @param requestType GET or PUT request
+ * @see TransferEvent#TRANSFER_COMPLETED
+ */
+ public void fireTransferCompleted(Resource resource, int requestType) {
+ TransferEvent event = new TransferEvent(wagon, resource, TransferEvent.TRANSFER_COMPLETED, requestType);
+ for (TransferListener listener : listeners) {
+ listener.transferCompleted(event);
+ }
+ }
+
+ /**
+ * Sends a transfer error event to all listeners
+ * @param resource The resource being transfered
+ * @param requestType GET or PUT request
+ * @param e The transfer error
+ */
+ public void fireTransferError(Resource resource, int requestType, Exception e) {
+ TransferEvent event = new TransferEvent(wagon, resource, e, requestType);
+ for (TransferListener listener : listeners) {
+ listener.transferError(event);
+ }
+ }
+}
diff --git a/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferProgress.java b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferProgress.java
new file mode 100644
index 0000000..6fbce32
--- /dev/null
+++ b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferProgress.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2004-2007 the original author or authors.
+ *
+ * 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.springframework.aws.maven;
+
+import org.apache.maven.wagon.resource.Resource;
+
+/**
+ * A class that encapsulates the notification of the transfer listeners for
+ * Maven Wagon.
+ *
+ * @author Ben Hale
+ * @since 1.1
+ */
+class TransferProgress {
+
+ private Resource resource;
+
+ private int requestType;
+
+ private TransferListenerSupport transferListeners;
+
+ public TransferProgress(Resource resource, int requestType, TransferListenerSupport listeners) {
+ this.resource = resource;
+ this.requestType = requestType;
+ this.transferListeners = listeners;
+ }
+
+ protected void notify(byte[] buffer, int length) {
+ transferListeners.fireTransferProgress(resource, requestType, buffer, length);
+ }
+
+}
diff --git a/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferProgressFileInputStream.java b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferProgressFileInputStream.java
new file mode 100644
index 0000000..fa4b434
--- /dev/null
+++ b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferProgressFileInputStream.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2004-2007 the original author or authors.
+ *
+ * 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.springframework.aws.maven;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+/**
+ * An extension to the {@link FileInputStream} that notifies a
+ * @{link TransferProgress} object as it is being written to.
+ *
+ * @author Ben Hale
+ * @since 1.1
+ */
+public class TransferProgressFileInputStream extends FileInputStream {
+
+ private TransferProgress progress;
+
+ public TransferProgressFileInputStream(File file, TransferProgress progress) throws FileNotFoundException {
+ super(file);
+ this.progress = progress;
+ }
+
+ public int read() throws IOException {
+ int b = super.read();
+ progress.notify(new byte[] { (byte) b }, 1);
+ return b;
+ }
+
+ public int read(byte b[]) throws IOException {
+ int count = super.read(b);
+ progress.notify(b, b.length);
+ return count;
+ }
+
+ public int read(byte b[], int off, int len) throws IOException {
+ int count = super.read(b, off, len);
+ if (off == 0) {
+ progress.notify(b, len);
+ }
+ else {
+ byte[] bytes = new byte[len];
+ System.arraycopy(b, off, bytes, 0, len);
+ progress.notify(bytes, len);
+ }
+ return count;
+ }
+}
diff --git a/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferProgressFileOutputStream.java b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferProgressFileOutputStream.java
new file mode 100644
index 0000000..7984a48
--- /dev/null
+++ b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferProgressFileOutputStream.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2004-2007 the original author or authors.
+ *
+ * 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.springframework.aws.maven;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+/**
+ * An extension to the {@link FileOutputStream} that notifies a
+ * @{link TransferProgress} object as it is being written to.
+ *
+ * @author Ben Hale
+ * @since 1.1
+ */
+class TransferProgressFileOutputStream extends FileOutputStream {
+
+ private TransferProgress progress;
+
+ public TransferProgressFileOutputStream(File file, TransferProgress progress) throws FileNotFoundException {
+ super(file);
+ this.progress = progress;
+ }
+
+ public void write(int b) throws IOException {
+ super.write(b);
+ progress.notify(new byte[] { (byte) b }, 1);
+ }
+
+ public void write(byte b[]) throws IOException {
+ super.write(b);
+ progress.notify(b, b.length);
+ }
+
+ public void write(byte b[], int off, int len) throws IOException {
+ super.write(b, off, len);
+ if (off == 0) {
+ progress.notify(b, len);
+ }
+ else {
+ byte[] bytes = new byte[len];
+ System.arraycopy(b, off, bytes, 0, len);
+ progress.notify(bytes, len);
+ }
+ }
+}
diff --git a/org.springframework.build.aws.maven/src/main/resources/META-INF/plexus/components.xml b/org.springframework.build.aws.maven/src/main/resources/META-INF/plexus/components.xml
new file mode 100644
index 0000000..1373d4d
--- /dev/null
+++ b/org.springframework.build.aws.maven/src/main/resources/META-INF/plexus/components.xml
@@ -0,0 +1,10 @@
+<component-set>
+ <components>
+ <component>
+ <role>org.apache.maven.wagon.Wagon</role>
+ <role-hint>s3</role-hint>
+ <implementation>org.springframework.aws.maven.SimpleStorageServiceWagon</implementation>
+ <instantiation-strategy>per-lookup</instantiation-strategy>
+ </component>
+ </components>
+</component-set>
diff --git a/org.springframework.build.aws.maven/src/main/resources/mime.types b/org.springframework.build.aws.maven/src/main/resources/mime.types
new file mode 100644
index 0000000..83d948e
--- /dev/null
+++ b/org.springframework.build.aws.maven/src/main/resources/mime.types
@@ -0,0 +1,602 @@
+# This is a comment. I love comments.
+
+# This file controls what Internet media types are sent to the client for
+# given file extension(s). Sending the correct media type to the client
+# is important so they know how to handle the content of the file.
+# Extra types can either be added here or by using an AddType directive
+# in your config files. For more information about Internet media types,
+# please read RFC 2045, 2046, 2047, 2048, and 2077. The Internet media type
+# registry is at <http://www.iana.org/assignments/media-types/>.
+
+# MIME type Extensions
+application/activemessage
+application/andrew-inset ez
+application/applefile
+application/atom+xml atom
+application/atomicmail
+application/batch-smtp
+application/beep+xml
+application/cals-1840
+application/cnrp+xml
+application/commonground
+application/cpl+xml
+application/cybercash
+application/dca-rft
+application/dec-dx
+application/dvcs
+application/edi-consent
+application/edifact
+application/edi-x12
+application/eshop
+application/font-tdpfr
+application/http
+application/hyperstudio
+application/iges
+application/index
+application/index.cmd
+application/index.obj
+application/index.response
+application/index.vnd
+application/iotp
+application/ipp
+application/isup
+application/mac-binhex40 hqx
+application/mac-compactpro cpt
+application/macwriteii
+application/marc
+application/mathematica
+application/mathml+xml mathml
+application/msword doc
+application/news-message-id
+application/news-transmission
+application/ocsp-request
+application/ocsp-response
+application/octet-stream bin dms lha lzh exe class so dll dmg
+application/oda oda
+application/ogg ogg
+application/parityfec
+application/pdf pdf
+application/pgp-encrypted
+application/pgp-keys
+application/pgp-signature
+application/pkcs10
+application/pkcs7-mime
+application/pkcs7-signature
+application/pkix-cert
+application/pkix-crl
+application/pkixcmp
+application/postscript ai eps ps
+application/prs.alvestrand.titrax-sheet
+application/prs.cww
+application/prs.nprend
+application/prs.plucker
+application/qsig
+application/rdf+xml rdf
+application/reginfo+xml
+application/remote-printing
+application/riscos
+application/rtf
+application/sdp
+application/set-payment
+application/set-payment-initiation
+application/set-registration
+application/set-registration-initiation
+application/sgml
+application/sgml-open-catalog
+application/sieve
+application/slate
+application/smil smi smil
+application/srgs gram
+application/srgs+xml grxml
+application/timestamp-query
+application/timestamp-reply
+application/tve-trigger
+application/vemmi
+application/vnd.3gpp.pic-bw-large
+application/vnd.3gpp.pic-bw-small
+application/vnd.3gpp.pic-bw-var
+application/vnd.3gpp.sms
+application/vnd.3m.post-it-notes
+application/vnd.accpac.simply.aso
+application/vnd.accpac.simply.imp
+application/vnd.acucobol
+application/vnd.acucorp
+application/vnd.adobe.xfdf
+application/vnd.aether.imp
+application/vnd.amiga.ami
+application/vnd.anser-web-certificate-issue-initiation
+application/vnd.anser-web-funds-transfer-initiation
+application/vnd.audiograph
+application/vnd.blueice.multipass
+application/vnd.bmi
+application/vnd.businessobjects
+application/vnd.canon-cpdl
+application/vnd.canon-lips
+application/vnd.cinderella
+application/vnd.claymore
+application/vnd.commerce-battelle
+application/vnd.commonspace
+application/vnd.contact.cmsg
+application/vnd.cosmocaller
+application/vnd.criticaltools.wbs+xml
+application/vnd.ctc-posml
+application/vnd.cups-postscript
+application/vnd.cups-raster
+application/vnd.cups-raw
+application/vnd.curl
+application/vnd.cybank
+application/vnd.data-vision.rdz
+application/vnd.dna
+application/vnd.dpgraph
+application/vnd.dreamfactory
+application/vnd.dxr
+application/vnd.ecdis-update
+application/vnd.ecowin.chart
+application/vnd.ecowin.filerequest
+application/vnd.ecowin.fileupdate
+application/vnd.ecowin.series
+application/vnd.ecowin.seriesrequest
+application/vnd.ecowin.seriesupdate
+application/vnd.enliven
+application/vnd.epson.esf
+application/vnd.epson.msf
+application/vnd.epson.quickanime
+application/vnd.epson.salt
+application/vnd.epson.ssf
+application/vnd.ericsson.quickcall
+application/vnd.eudora.data
+application/vnd.fdf
+application/vnd.ffsns
+application/vnd.fints
+application/vnd.flographit
+application/vnd.framemaker
+application/vnd.fsc.weblaunch
+application/vnd.fujitsu.oasys
+application/vnd.fujitsu.oasys2
+application/vnd.fujitsu.oasys3
+application/vnd.fujitsu.oasysgp
+application/vnd.fujitsu.oasysprs
+application/vnd.fujixerox.ddd
+application/vnd.fujixerox.docuworks
+application/vnd.fujixerox.docuworks.binder
+application/vnd.fut-misnet
+application/vnd.grafeq
+application/vnd.groove-account
+application/vnd.groove-help
+application/vnd.groove-identity-message
+application/vnd.groove-injector
+application/vnd.groove-tool-message
+application/vnd.groove-tool-template
+application/vnd.groove-vcard
+application/vnd.hbci
+application/vnd.hhe.lesson-player
+application/vnd.hp-hpgl
+application/vnd.hp-hpid
+application/vnd.hp-hps
+application/vnd.hp-pcl
+application/vnd.hp-pclxl
+application/vnd.httphone
+application/vnd.hzn-3d-crossword
+application/vnd.ibm.afplinedata
+application/vnd.ibm.electronic-media
+application/vnd.ibm.minipay
+application/vnd.ibm.modcap
+application/vnd.ibm.rights-management
+application/vnd.ibm.secure-container
+application/vnd.informix-visionary
+application/vnd.intercon.formnet
+application/vnd.intertrust.digibox
+application/vnd.intertrust.nncp
+application/vnd.intu.qbo
+application/vnd.intu.qfx
+application/vnd.irepository.package+xml
+application/vnd.is-xpr
+application/vnd.japannet-directory-service
+application/vnd.japannet-jpnstore-wakeup
+application/vnd.japannet-payment-wakeup
+application/vnd.japannet-registration
+application/vnd.japannet-registration-wakeup
+application/vnd.japannet-setstore-wakeup
+application/vnd.japannet-verification
+application/vnd.japannet-verification-wakeup
+application/vnd.jisp
+application/vnd.kde.karbon
+application/vnd.kde.kchart
+application/vnd.kde.kformula
+application/vnd.kde.kivio
+application/vnd.kde.kontour
+application/vnd.kde.kpresenter
+application/vnd.kde.kspread
+application/vnd.kde.kword
+application/vnd.kenameaapp
+application/vnd.koan
+application/vnd.liberty-request+xml
+application/vnd.llamagraphics.life-balance.desktop
+application/vnd.llamagraphics.life-balance.exchange+xml
+application/vnd.lotus-1-2-3
+application/vnd.lotus-approach
+application/vnd.lotus-freelance
+application/vnd.lotus-notes
+application/vnd.lotus-organizer
+application/vnd.lotus-screencam
+application/vnd.lotus-wordpro
+application/vnd.mcd
+application/vnd.mediastation.cdkey
+application/vnd.meridian-slingshot
+application/vnd.micrografx.flo
+application/vnd.micrografx.igx
+application/vnd.mif mif
+application/vnd.minisoft-hp3000-save
+application/vnd.mitsubishi.misty-guard.trustweb
+application/vnd.mobius.daf
+application/vnd.mobius.dis
+application/vnd.mobius.mbk
+application/vnd.mobius.mqy
+application/vnd.mobius.msl
+application/vnd.mobius.plc
+application/vnd.mobius.txf
+application/vnd.mophun.application
+application/vnd.mophun.certificate
+application/vnd.motorola.flexsuite
+application/vnd.motorola.flexsuite.adsi
+application/vnd.motorola.flexsuite.fis
+application/vnd.motorola.flexsuite.gotap
+application/vnd.motorola.flexsuite.kmr
+application/vnd.motorola.flexsuite.ttc
+application/vnd.motorola.flexsuite.wem
+application/vnd.mozilla.xul+xml xul
+application/vnd.ms-artgalry
+application/vnd.ms-asf
+application/vnd.ms-excel xls
+application/vnd.ms-lrm
+application/vnd.ms-powerpoint ppt
+application/vnd.ms-project
+application/vnd.ms-tnef
+application/vnd.ms-works
+application/vnd.ms-wpl
+application/vnd.mseq
+application/vnd.msign
+application/vnd.music-niff
+application/vnd.musician
+application/vnd.netfpx
+application/vnd.noblenet-directory
+application/vnd.noblenet-sealer
+application/vnd.noblenet-web
+application/vnd.novadigm.edm
+application/vnd.novadigm.edx
+application/vnd.novadigm.ext
+application/vnd.obn
+application/vnd.osa.netdeploy
+application/vnd.palm
+application/vnd.pg.format
+application/vnd.pg.osasli
+application/vnd.powerbuilder6
+application/vnd.powerbuilder6-s
+application/vnd.powerbuilder7
+application/vnd.powerbuilder7-s
+application/vnd.powerbuilder75
+application/vnd.powerbuilder75-s
+application/vnd.previewsystems.box
+application/vnd.publishare-delta-tree
+application/vnd.pvi.ptid1
+application/vnd.pwg-multiplexed
+application/vnd.pwg-xhtml-print+xml
+application/vnd.quark.quarkxpress
+application/vnd.rapid
+application/vnd.rn-realmedia rm
+application/vnd.s3sms
+application/vnd.sealed.net
+application/vnd.seemail
+application/vnd.shana.informed.formdata
+application/vnd.shana.informed.formtemplate
+application/vnd.shana.informed.interchange
+application/vnd.shana.informed.package
+application/vnd.smaf
+application/vnd.sss-cod
+application/vnd.sss-dtf
+application/vnd.sss-ntf
+application/vnd.street-stream
+application/vnd.svd
+application/vnd.swiftview-ics
+application/vnd.triscape.mxs
+application/vnd.trueapp
+application/vnd.truedoc
+application/vnd.ufdl
+application/vnd.uplanet.alert
+application/vnd.uplanet.alert-wbxml
+application/vnd.uplanet.bearer-choice
+application/vnd.uplanet.bearer-choice-wbxml
+application/vnd.uplanet.cacheop
+application/vnd.uplanet.cacheop-wbxml
+application/vnd.uplanet.channel
+application/vnd.uplanet.channel-wbxml
+application/vnd.uplanet.list
+application/vnd.uplanet.list-wbxml
+application/vnd.uplanet.listcmd
+application/vnd.uplanet.listcmd-wbxml
+application/vnd.uplanet.signal
+application/vnd.vcx
+application/vnd.vectorworks
+application/vnd.vidsoft.vidconference
+application/vnd.visio
+application/vnd.visionary
+application/vnd.vividence.scriptfile
+application/vnd.vsf
+application/vnd.wap.sic
+application/vnd.wap.slc
+application/vnd.wap.wbxml wbxml
+application/vnd.wap.wmlc wmlc
+application/vnd.wap.wmlscriptc wmlsc
+application/vnd.webturbo
+application/vnd.wrq-hp3000-labelled
+application/vnd.wt.stf
+application/vnd.wv.csp+wbxml
+application/vnd.xara
+application/vnd.xfdl
+application/vnd.yamaha.hv-dic
+application/vnd.yamaha.hv-script
+application/vnd.yamaha.hv-voice
+application/vnd.yellowriver-custom-menu
+application/voicexml+xml vxml
+application/watcherinfo+xml
+application/whoispp-query
+application/whoispp-response
+application/wita
+application/wordperfect5.1
+application/x-bcpio bcpio
+application/x-cdlink vcd
+application/x-chess-pgn pgn
+application/x-compress
+application/x-cpio cpio
+application/x-csh csh
+application/x-director dcr dir dxr
+application/x-dvi dvi
+application/x-futuresplash spl
+application/x-gtar gtar
+application/x-gzip gz
+application/x-hdf hdf
+application/x-javascript js
+application/x-java-jnlp-file jnlp
+application/x-koan skp skd skt skm
+application/x-latex latex
+application/x-netcdf nc cdf
+application/x-sh sh
+application/x-shar shar
+application/x-shockwave-flash swf
+application/x-stuffit sit
+application/x-sv4cpio sv4cpio
+application/x-sv4crc sv4crc
+application/x-tar tar
+application/x-tcl tcl
+application/x-tex tex
+application/x-texinfo texinfo texi
+application/x-troff t tr roff
+application/x-troff-man man
+application/x-troff-me me
+application/x-troff-ms ms
+application/x-ustar ustar
+application/x-wais-source src
+application/x400-bp
+application/xhtml+xml xhtml xht
+application/xslt+xml xslt
+application/xml xml xsl
+application/xml-dtd dtd
+application/xml-external-parsed-entity
+application/zip zip
+audio/32kadpcm
+audio/amr
+audio/amr-wb
+audio/basic au snd
+audio/cn
+audio/dat12
+audio/dsr-es201108
+audio/dvi4
+audio/evrc
+audio/evrc0
+audio/g722
+audio/g.722.1
+audio/g723
+audio/g726-16
+audio/g726-24
+audio/g726-32
+audio/g726-40
+audio/g728
+audio/g729
+audio/g729D
+audio/g729E
+audio/gsm
+audio/gsm-efr
+audio/l8
+audio/l16
+audio/l20
+audio/l24
+audio/lpc
+audio/midi mid midi kar
+audio/mpa
+audio/mpa-robust
+audio/mp4a-latm m4a m4p
+audio/mpeg mpga mp2 mp3
+audio/parityfec
+audio/pcma
+audio/pcmu
+audio/prs.sid
+audio/qcelp
+audio/red
+audio/smv
+audio/smv0
+audio/telephone-event
+audio/tone
+audio/vdvi
+audio/vnd.3gpp.iufp
+audio/vnd.cisco.nse
+audio/vnd.cns.anp1
+audio/vnd.cns.inf1
+audio/vnd.digital-winds
+audio/vnd.everad.plj
+audio/vnd.lucent.voice
+audio/vnd.nortel.vbk
+audio/vnd.nuera.ecelp4800
+audio/vnd.nuera.ecelp7470
+audio/vnd.nuera.ecelp9600
+audio/vnd.octel.sbc
+audio/vnd.qcelp
+audio/vnd.rhetorex.32kadpcm
+audio/vnd.vmx.cvsd
+audio/x-aiff aif aiff aifc
+audio/x-alaw-basic
+audio/x-mpegurl m3u
+audio/x-pn-realaudio ram ra
+audio/x-pn-realaudio-plugin
+audio/x-wav wav
+chemical/x-pdb pdb
+chemical/x-xyz xyz
+image/bmp bmp
+image/cgm cgm
+image/g3fax
+image/gif gif
+image/ief ief
+image/jpeg jpeg jpg jpe
+image/jp2 jp2
+image/naplps
+image/pict pict pic pct
+image/png png
+image/prs.btif
+image/prs.pti
+image/svg+xml svg
+image/t38
+image/tiff tiff tif
+image/tiff-fx
+image/vnd.cns.inf2
+image/vnd.djvu djvu djv
+image/vnd.dwg
+image/vnd.dxf
+image/vnd.fastbidsheet
+image/vnd.fpx
+image/vnd.fst
+image/vnd.fujixerox.edmics-mmr
+image/vnd.fujixerox.edmics-rlc
+image/vnd.globalgraphics.pgb
+image/vnd.mix
+image/vnd.ms-modi
+image/vnd.net-fpx
+image/vnd.svf
+image/vnd.wap.wbmp wbmp
+image/vnd.xiff
+image/x-cmu-raster ras
+image/x-macpaint pntg pnt mac
+image/x-icon ico
+image/x-portable-anymap pnm
+image/x-portable-bitmap pbm
+image/x-portable-graymap pgm
+image/x-portable-pixmap ppm
+image/x-quicktime qtif qti
+image/x-rgb rgb
+image/x-xbitmap xbm
+image/x-xpixmap xpm
+image/x-xwindowdump xwd
+message/delivery-status
+message/disposition-notification
+message/external-body
+message/http
+message/news
+message/partial
+message/rfc822
+message/s-http
+message/sip
+message/sipfrag
+model/iges igs iges
+model/mesh msh mesh silo
+model/vnd.dwf
+model/vnd.flatland.3dml
+model/vnd.gdl
+model/vnd.gs-gdl
+model/vnd.gtw
+model/vnd.mts
+model/vnd.parasolid.transmit.binary
+model/vnd.parasolid.transmit.text
+model/vnd.vtu
+model/vrml wrl vrml
+multipart/alternative
+multipart/appledouble
+multipart/byteranges
+multipart/digest
+multipart/encrypted
+multipart/form-data
+multipart/header-set
+multipart/mixed
+multipart/parallel
+multipart/related
+multipart/report
+multipart/signed
+multipart/voice-message
+text/calendar ics ifb
+text/css css
+text/directory
+text/enriched
+text/html html htm
+text/parityfec
+text/plain asc txt
+text/prs.lines.tag
+text/rfc822-headers
+text/richtext rtx
+text/rtf rtf
+text/sgml sgml sgm
+text/t140
+text/tab-separated-values tsv
+text/uri-list
+text/vnd.abc
+text/vnd.curl
+text/vnd.dmclientscript
+text/vnd.fly
+text/vnd.fmi.flexstor
+text/vnd.in3d.3dml
+text/vnd.in3d.spot
+text/vnd.iptc.nitf
+text/vnd.iptc.newsml
+text/vnd.latex-z
+text/vnd.motorola.reflex
+text/vnd.ms-mediapackage
+text/vnd.net2phone.commcenter.command
+text/vnd.sun.j2me.app-descriptor
+text/vnd.wap.si
+text/vnd.wap.sl
+text/vnd.wap.wml wml
+text/vnd.wap.wmlscript wmls
+text/x-setext etx
+text/xml
+text/xml-external-parsed-entity
+video/3gpp 3gp
+video/bmpeg
+video/bt656
+video/celb
+video/dv
+video/h261
+video/h263
+video/h263-1998
+video/h263-2000
+video/jpeg
+video/mp1s
+video/mp2p
+video/mp2t
+video/mp4 mp4
+video/mp4v-es
+video/mpv
+video/mpeg mpeg mpg mpe
+video/nv
+video/parityfec
+video/pointer
+video/quicktime qt mov
+video/smpte292m
+video/vnd.fvt
+video/vnd.motorola.video
+video/vnd.motorola.videop
+video/vnd.mpegurl mxu m4u
+video/vnd.nokia.interleaved-multimedia
+video/vnd.objectvideo
+video/vnd.vivo
+video/x-dv dv dif
+video/x-flv flv
+video/x-ms-wmv wmv
+video/x-msvideo avi
+video/x-sgi-movie movie
+x-conference/x-cooltalk ice