🏡 index : ~doyle/blockbuster.git

author Jordan Doyle <jordan.doyle@outlook.com> 2015-04-09 21:05:46.0 +00:00:00
committer Jordan Doyle <jordan.doyle@outlook.com> 2015-04-09 21:05:46.0 +00:00:00
commit
a17e392240c09d1b161c0215be86a67215f90c21 [patch]
tree
7a9b5ed235fcd259a71b48b89c9d1abc1af3e46f
download
a17e392240c09d1b161c0215be86a67215f90c21.tar.gz

initial commit



Diff

 .classpath                                                              |  26 +-
 .project                                                                |  23 +-
 .settings/org.eclipse.core.resources.prefs                              |   4 +-
 .settings/org.eclipse.jdt.core.prefs                                    | 398 +++++++-
 .settings/org.eclipse.jdt.ui.prefs                                      |   4 +-
 .settings/org.eclipse.m2e.core.prefs                                    |   4 +-
 logs/2015-04-09-1.log.gz                                                | Bin 0 -> 66 bytes
 logs/2015-04-09-2.log.gz                                                | Bin 0 -> 66 bytes
 logs/2015-04-09-3.log.gz                                                | Bin 0 -> 66 bytes
 logs/2015-04-09-4.log.gz                                                | Bin 0 -> 66 bytes
 logs/2015-04-09-5.log.gz                                                | Bin 0 -> 66 bytes
 logs/2015-04-09-6.log                                                   |   4 +-
 logs/2015-04-09-6.log.gz                                                | Bin 0 -> 411 bytes
 logs/2015-04-09-7.log                                                   |   5 +-
 logs/latest.log                                                         |   6 +-
 pom.xml                                                                 |  68 +-
 src/main/java/wf/doyle/blockbuster/App.java                             |  70 +-
 src/main/java/wf/doyle/blockbuster/file/FileReader.java                 | 344 ++++++-
 src/main/java/wf/doyle/blockbuster/file/FileWriter.java                 | 128 ++-
 src/main/java/wf/doyle/blockbuster/gui/GUI.java                         | 170 +++-
 src/main/java/wf/doyle/blockbuster/item/AudioVisualItem.java            |  22 +-
 src/main/java/wf/doyle/blockbuster/item/LibraryItem.java                | 161 +++-
 src/main/java/wf/doyle/blockbuster/item/PrintedItem.java                |  33 +-
 src/main/java/wf/doyle/blockbuster/item/items/audiovisual/CD.java       |  43 +-
 src/main/java/wf/doyle/blockbuster/item/items/audiovisual/DVD.java      |  30 +-
 src/main/java/wf/doyle/blockbuster/item/items/printed/Book.java         |  43 +-
 src/main/java/wf/doyle/blockbuster/item/items/printed/Periodical.java   |  45 +-
 src/main/java/wf/doyle/blockbuster/util/EnumLineType.java               |  33 +-
 src/main/java/wf/doyle/blockbuster/util/Library.java                    | 109 ++-
 src/main/java/wf/doyle/blockbuster/util/User.java                       |  58 +-
 src/main/resources/data/cd_&_dvd_data_1.txt                             |  25 +-
 src/main/resources/data/cd_&_dvd_data_2.txt                             |  23 +-
 src/main/resources/data/cd_&_dvd_data_3.txt                             |  26 +-
 src/main/resources/data/cd_data.txt                                     |  17 +-
 src/main/resources/data/items_all.txt                                   |  41 +-
 src/main/resources/log4j2.xml                                           |  27 +-
 src/test/java/wf/doyle/blockbuster/AppTest.java                         |  38 +-
 target/classes/data/cd_&_dvd_data_1.txt                                 |  25 +-
 target/classes/data/cd_&_dvd_data_2.txt                                 |  23 +-
 target/classes/data/cd_&_dvd_data_3.txt                                 |  26 +-
 target/classes/data/cd_data.txt                                         |  17 +-
 target/classes/data/items_all.txt                                       |  41 +-
 target/classes/log4j2.xml                                               |  27 +-
 target/classes/serialized-data.txt                                      |   0
 target/classes/wf/doyle/blockbuster/App.class                           | Bin 0 -> 1612 bytes
 target/classes/wf/doyle/blockbuster/file/FileReader.class               | Bin 0 -> 8798 bytes
 target/classes/wf/doyle/blockbuster/file/FileWriter$1.class             | Bin 0 -> 1349 bytes
 target/classes/wf/doyle/blockbuster/file/FileWriter.class               | Bin 0 -> 3980 bytes
 target/classes/wf/doyle/blockbuster/gui/GUI$1.class                     | Bin 0 -> 1237 bytes
 target/classes/wf/doyle/blockbuster/gui/GUI.class                       | Bin 0 -> 5499 bytes
 target/classes/wf/doyle/blockbuster/item/AudioVisualItem.class          | Bin 0 -> 463 bytes
 target/classes/wf/doyle/blockbuster/item/LibraryItem.class              | Bin 0 -> 3275 bytes
 target/classes/wf/doyle/blockbuster/item/PrintedItem.class              | Bin 0 -> 601 bytes
 target/classes/wf/doyle/blockbuster/item/items/audiovisual/CD.class     | Bin 0 -> 827 bytes
 target/classes/wf/doyle/blockbuster/item/items/audiovisual/DVD.class    | Bin 0 -> 713 bytes
 target/classes/wf/doyle/blockbuster/item/items/printed/Book.class       | Bin 0 -> 797 bytes
 target/classes/wf/doyle/blockbuster/item/items/printed/Periodical.class | Bin 0 -> 1277 bytes
 target/classes/wf/doyle/blockbuster/util/EnumLineType.class             | Bin 0 -> 1309 bytes
 target/classes/wf/doyle/blockbuster/util/Library$1.class                | Bin 0 -> 1186 bytes
 target/classes/wf/doyle/blockbuster/util/Library.class                  | Bin 0 -> 3783 bytes
 target/classes/wf/doyle/blockbuster/util/User.class                     | Bin 0 -> 886 bytes
 target/test-classes/wf/doyle/blockbuster/AppTest.class                  | Bin 0 -> 627 bytes
 62 files changed, 2187 insertions(+)

diff --git a/.classpath b/.classpath
new file mode 100644
index 0000000..9c865fb
--- /dev/null
+++ b/.classpath
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry kind="src" output="target/classes" path="src/main/java">
		<attributes>
			<attribute name="optional" value="true"/>
			<attribute name="maven.pomderived" value="true"/>
		</attributes>
	</classpathentry>
	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
		<attributes>
			<attribute name="optional" value="true"/>
			<attribute name="maven.pomderived" value="true"/>
		</attributes>
	</classpathentry>
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
		<attributes>
			<attribute name="maven.pomderived" value="true"/>
		</attributes>
	</classpathentry>
	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
		<attributes>
			<attribute name="maven.pomderived" value="true"/>
		</attributes>
	</classpathentry>
	<classpathentry kind="output" path="target/classes"/>
</classpath>
diff --git a/.project b/.project
new file mode 100644
index 0000000..724e3b2
--- /dev/null
+++ b/.project
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
	<name>blockbuster</name>
	<comment></comment>
	<projects>
	</projects>
	<buildSpec>
		<buildCommand>
			<name>org.eclipse.jdt.core.javabuilder</name>
			<arguments>
			</arguments>
		</buildCommand>
		<buildCommand>
			<name>org.eclipse.m2e.core.maven2Builder</name>
			<arguments>
			</arguments>
		</buildCommand>
	</buildSpec>
	<natures>
		<nature>org.eclipse.jdt.core.javanature</nature>
		<nature>org.eclipse.m2e.core.maven2Nature</nature>
	</natures>
</projectDescription>
diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..f9fe345
--- /dev/null
+++ b/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,4 @@
eclipse.preferences.version=1
encoding//src/main/java=UTF-8
encoding//src/test/java=UTF-8
encoding/<project>=UTF-8
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..8124721
--- /dev/null
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,398 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.doc.comment.support=enabled
org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
org.eclipse.jdt.core.compiler.problem.deadCode=warning
org.eclipse.jdt.core.compiler.problem.deprecation=warning
org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error
org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=private
org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private
org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
org.eclipse.jdt.core.compiler.problem.nullReference=warning
org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning
org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning
org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=warning
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
org.eclipse.jdt.core.compiler.problem.unusedImport=warning
org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
org.eclipse.jdt.core.compiler.source=1.8
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=0
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
org.eclipse.jdt.core.formatter.alignment_for_binary_expression=0
org.eclipse.jdt.core.formatter.alignment_for_compact_if=0
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=0
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=0
org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=0
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=0
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=0
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=next_line
org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block=next_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=next_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
org.eclipse.jdt.core.formatter.brace_position_for_switch=next_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=true
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=true
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=true
org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
org.eclipse.jdt.core.formatter.comment.line_length=80
org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
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.disabling_tag=@formatter\:off
org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
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=true
org.eclipse.jdt.core.formatter.indentation.size=8
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=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=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=do not 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=do not 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=do not 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_lambda_arrow=do not 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=do not 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_try=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_semicolon_in_try_resources=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=do not 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_try=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_lambda_arrow=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=do not 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=do not 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=do not 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=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=do not 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=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=do not 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=do not 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_semicolon_in_try_resources=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.join_lines_in_comments=true
org.eclipse.jdt.core.formatter.join_wrapped_lines=true
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=true
org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
org.eclipse.jdt.core.formatter.lineSplit=0
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_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=true
org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..4511abb
--- /dev/null
+++ b/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,4 @@
cleanup_settings_version=2
eclipse.preferences.version=1
formatter_profile=_Jordan
formatter_settings_version=12
diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1
diff --git a/logs/2015-04-09-1.log.gz b/logs/2015-04-09-1.log.gz
new file mode 100644
index 0000000..14bda9c
Binary files /dev/null and b/logs/2015-04-09-1.log.gz differ
diff --git a/logs/2015-04-09-2.log.gz b/logs/2015-04-09-2.log.gz
new file mode 100644
index 0000000..aac3166
Binary files /dev/null and b/logs/2015-04-09-2.log.gz differ
diff --git a/logs/2015-04-09-3.log.gz b/logs/2015-04-09-3.log.gz
new file mode 100644
index 0000000..939e6c8
Binary files /dev/null and b/logs/2015-04-09-3.log.gz differ
diff --git a/logs/2015-04-09-4.log.gz b/logs/2015-04-09-4.log.gz
new file mode 100644
index 0000000..0bff6bd
Binary files /dev/null and b/logs/2015-04-09-4.log.gz differ
diff --git a/logs/2015-04-09-5.log.gz b/logs/2015-04-09-5.log.gz
new file mode 100644
index 0000000..cecf6a2
Binary files /dev/null and b/logs/2015-04-09-5.log.gz differ
diff --git a/logs/2015-04-09-6.log b/logs/2015-04-09-6.log
new file mode 100644
index 0000000..7e6e18e
--- /dev/null
+++ b/logs/2015-04-09-6.log
@@ -0,0 +1,4 @@
[11:43:34] [main/INFO]: BlockBuster starting
[11:52:27] [main/INFO]: BlockBuster starting
[11:54:30] [main/INFO]: BlockBuster starting
[11:54:41] [main/INFO]: BlockBuster starting
diff --git a/logs/2015-04-09-6.log.gz b/logs/2015-04-09-6.log.gz
new file mode 100644
index 0000000..3a46928
Binary files /dev/null and b/logs/2015-04-09-6.log.gz differ
diff --git a/logs/2015-04-09-7.log b/logs/2015-04-09-7.log
new file mode 100644
index 0000000..d41fc87
--- /dev/null
+++ b/logs/2015-04-09-7.log
@@ -0,0 +1,5 @@
[11:43:34] [main/INFO]: BlockBuster starting
[11:52:27] [main/INFO]: BlockBuster starting
[11:54:30] [main/INFO]: BlockBuster starting
[11:54:41] [main/INFO]: BlockBuster starting
[11:56:44] [main/INFO]: BlockBuster starting
diff --git a/logs/latest.log b/logs/latest.log
new file mode 100644
index 0000000..9b6c2e5
--- /dev/null
+++ b/logs/latest.log
@@ -0,0 +1,6 @@
[11:43:34] [main/INFO]: BlockBuster starting
[11:52:27] [main/INFO]: BlockBuster starting
[11:54:30] [main/INFO]: BlockBuster starting
[11:54:41] [main/INFO]: BlockBuster starting
[11:56:44] [main/INFO]: BlockBuster starting
[11:56:51] [main/INFO]: BlockBuster starting
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..e54eea8
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,68 @@
<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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>wf.doyle</groupId>
	<artifactId>blockbuster</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>blockbuster</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
      
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-api</artifactId>
			<version>2.1</version>
		</dependency>
    
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
			<version>2.1</version>
		</dependency>
		
		<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<version>18.0</version>
		</dependency>
		
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>3.4</version>
		</dependency>
	</dependencies>
	
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				
				<configuration>
					<archive>
						<manifest>
							<addClasspath>true</addClasspath>
							<mainClass>wf.doyle.blockbuster.App</mainClass>
							<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
							<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
						</manifest>
					</archive>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>
diff --git a/src/main/java/wf/doyle/blockbuster/App.java b/src/main/java/wf/doyle/blockbuster/App.java
new file mode 100644
index 0000000..9c3536a
--- /dev/null
+++ b/src/main/java/wf/doyle/blockbuster/App.java
@@ -0,0 +1,70 @@
package wf.doyle.blockbuster;

import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import wf.doyle.blockbuster.gui.GUI;
import wf.doyle.blockbuster.item.LibraryItem;
import wf.doyle.blockbuster.util.Library;
import wf.doyle.blockbuster.util.User;

/**
 * Entry class of BlockBuster
 * 
 * @author Jordan Doyle
 */
public class App {
	/**
	 * Log4j logger instance
	 */
	public static final Logger LOGGER = LogManager.getLogger("BlockBuster");

	/**
	 * List of items available in the library
	 */
	public static List<LibraryItem> items = new ArrayList<LibraryItem>();

	/**
	 * Local user
	 */
	public static final User USER = new User();
	
	/**
	 * Entry point of BlockBuster
	 * 
	 * @param args
	 *            arguments passed to program
	 */
	public static void main(String[] args)
	{
		
		LOGGER.info("BlockBuster starting");

		Library l = null;
		try
		{
			l = new Library();
		}
		catch(URISyntaxException e1)
		{
			e1.printStackTrace();
		}

		if(args.length > 0 && args[0] == "-debug") {
			l.printAllDetails();
			l.printAllDetailsSortedOnTitle();
			return;
		}
		
		GUI n = new GUI();
		n.setVisible(true);
		
		// write to file:
		// FileWriter a = new
		// FileWriter(Paths.get(App.class.getResource("/serialized-data.txt").toURI())).serializeItems();
	}
}
diff --git a/src/main/java/wf/doyle/blockbuster/file/FileReader.java b/src/main/java/wf/doyle/blockbuster/file/FileReader.java
new file mode 100644
index 0000000..7b5a0b8
--- /dev/null
+++ b/src/main/java/wf/doyle/blockbuster/file/FileReader.java
@@ -0,0 +1,344 @@
package wf.doyle.blockbuster.file;

import java.io.IOException;
import java.lang.reflect.Field;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.ListIterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Stream;

import com.google.common.base.CaseFormat;

import wf.doyle.blockbuster.App;
import wf.doyle.blockbuster.item.LibraryItem;
import wf.doyle.blockbuster.util.EnumLineType;

/**
 * Provides functions to read and parse provided files.
 * 
 * @author Jordan Doyle
 */
public class FileReader {
	/**
	 * Path to the file to read
	 */
	private Path path;

	/**
	 * Enum containing the current line type.
	 */
	private EnumLineType currentLine = EnumLineType.NONE;

	/**
	 * Pattern to find data types
	 */
	private Pattern dataTypes = Pattern.compile("\\[(.*) data\\]");

	/**
	 * Line number we're currently dealing with.
	 */
	private int lineNumber = 0;

	/**
	 * A list of what the current line type gives us, allows easy setting with
	 * reflection
	 */
	private String[] lineContains;

	/**
	 * Contains a list of what each line type should contain which lets us write
	 * data back to the file easily.
	 */
	public static Map<String, String[]> containing = new HashMap<String, String[]>();

	/**
	 * Contains a mapping of EnumLineTypes to the respective classes for use in
	 * {@link #wf.doyle.blockbuster.item.LibraryItem.toString()}
	 */
	public static Map<EnumLineType, Class<? extends LibraryItem>> classes = new HashMap<EnumLineType, Class<? extends LibraryItem>>();

	/**
	 * Instantiates a new instance of FileReader
	 * 
	 * @param path
	 *            path of the file to read
	 */
	public FileReader(Path path)
	{
		this.path = path;
	}

	/**
	 * Parses the current file
	 */
	public void parseFile()
	{
		// Open the file using UTF-8 charset
		try(Stream<String> lines = Files.lines(this.path, StandardCharsets.UTF_8))
		{
			Iterator<String> it = lines.iterator();

			while(it.hasNext())
			{
				this.lineNumber++;

				String line = it.next();

				// if we don't know what we're currently dealing with, lets just
				// leave it.
				if(this.currentLine == EnumLineType.UNKNOWN) continue;

				parseLine(line.trim());
			}
		}
		catch(IOException e)
		{
			App.LOGGER.error("Error whilst reading provided file", e);
		}
	}

	/**
	 * @return storage class from current line type
	 */
	private Class<? extends LibraryItem> getClassType()
	{
		Class<? extends LibraryItem> classType = null;

		// this is so horrible but there's no ways around it if I want to test
		// multiple packages for the class we want.
		try
		{
			// check if it's in wf.doyle.blockbuster.item.items.audiovisual in
			// its current case
			classType = (Class<? extends LibraryItem>) Class.forName("wf.doyle.blockbuster.item.items.audiovisual." + this.currentLine.toString());
		}
		catch(ClassNotFoundException e)
		{
			try
			{
				// check if it's in wf.doyle.blockbuster.item.items.printed in
				// camel case
				classType = (Class<? extends LibraryItem>) Class.forName("wf.doyle.blockbuster.item.items.printed." + CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, this.currentLine.toString()));
			}
			catch(ClassNotFoundException ex)
			{
				try
				{
					// check if it's in
					// wf.doyle.blockbuster.item.items.audiovisual in camel case
					classType = (Class<? extends LibraryItem>) Class.forName("wf.doyle.blockbuster.item.items.audiovisual." + CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, this.currentLine.toString()));
				}
				catch(ClassNotFoundException ex2)
				{
					App.LOGGER.error("Couldn't find storage class for this line type.", ex2);
				}
			}
		}

		return classType;
	}

	/**
	 * Find a private field in a class (and its parents)
	 * 
	 * @param nameRaw
	 *            name of field to find
	 * @param classType
	 *            class to find the field in
	 * @return the found private field
	 */
	public static Field getField(String nameRaw, Class<? extends LibraryItem> classType)
	{
		// for some reason the data files have extra spaces, why would you do
		// this :(
		String name = nameRaw.trim();

		Field field = null;

		// again, horrible code but it's the only thing we can do when we're
		// looking in multiple classes for a private field.
		try
		{
			// check LibraryItem for the field
			field = classType.getSuperclass().getSuperclass().getDeclaredField(name);
		}
		catch(NoSuchFieldException | SecurityException e)
		{
			try
			{
				// check the parent class for the field
				// (AudioVisualItem/PrintedItem)
				field = classType.getSuperclass().getDeclaredField(name);
			}
			catch(NoSuchFieldException | SecurityException ex)
			{
				try
				{
					// check the current class for the field
					field = classType.getDeclaredField(name);
				}
				catch(NoSuchFieldException | SecurityException ex2)
				{
					App.LOGGER.error("Couldn't find field " + name + " in " + classType.getName(), ex2);
				}
			}
		}

		return field;
	}

	/**
	 * Set the value of a private field
	 * 
	 * @param f
	 *            field to set the value of
	 * @param instance
	 *            instance to set the value in
	 * @param data
	 *            data to set the value as
	 * @return instance of LibraryItem
	 */
	public static LibraryItem setField(Field f, LibraryItem instance, String data)
	{
		try
		{
			try
			{
				// check if the field type is int
				if(f.getType().isAssignableFrom(int.class))
				{
					int val = (int) Double.parseDouble(data);
					f.setAccessible(true);
					f.set(instance, val);

					return instance;
				}
			}
			catch(NumberFormatException nfe)
			{
			}

			// check if the data is a boolean
			if(data.equalsIgnoreCase("true") || data.equalsIgnoreCase("false"))
			{
				boolean b = Boolean.parseBoolean(data);
				f.setAccessible(true);
				f.set(instance, b);

				return instance;
			}

			f.setAccessible(true);
			f.set(instance, data);
		}
		catch(IllegalArgumentException | IllegalAccessException e)
		{
			App.LOGGER.error("Couldn't set value of " + f.getName() + " in " + instance.getClass().getName(), e);
		}

		return instance;
	}

	/**
	 * Parses the current line and decides what to do with it.
	 * 
	 * @param line
	 *            string to parse
	 */
	private void parseLine(String line)
	{
		if(line.isEmpty() || line.startsWith("//"))
		{
			// get the data types from the "// data is" line, afaik it's not
			// what it's intended for, but ah well let's be lazy and use it for
			// reflection
			if(line.startsWith("// data is")) this.lineContains = line.substring(line.indexOf("// data is") + "// data is".length()).split(", ");

			return;
		}

		// if this line is a declaration block ([CD data]) then we wont continue
		// from here, we've already parsed it.
		if(determineLineType(line)) return;

		Class<? extends LibraryItem> itemClass = this.getClassType();

		// just some fields to help me with reflection. "classes" maps a class
		// object to an EnumLineType and "containing" just parses the "data is"
		// line for us for the reflection
		if(!containing.containsKey(itemClass.getName())) containing.put(itemClass.getName(), this.lineContains);
		if(!classes.containsKey(this.currentLine)) classes.put(this.currentLine, itemClass);

		try
		{
			LibraryItem item = itemClass.newInstance();

			// split the data on the line by comma
			ListIterator<String> iterator = Arrays.asList(line.split(",")).listIterator();

			while(iterator.hasNext())
			{
				int key = iterator.nextIndex();
				String value = iterator.next().trim(); // again with the
													   // unnecessary
													   // whitespaces

				Field field = getField(this.lineContains[key].trim(), itemClass);

				item = setField(field, item, value);
			}

			// add this storage class to our main array
			App.items.add(item);
		}
		catch(IllegalAccessException | InstantiationException e)
		{
			App.LOGGER.error("Couldn't instantiate storage class.", e);
		}
	}

	/**
	 * Parses the current line and determines the type of data it is providing
	 * 
	 * @param line
	 *            string to parse to type
	 * @return true if found a line type
	 */
	private boolean determineLineType(String line)
	{
		Matcher m = this.dataTypes.matcher(line);

		if(!m.find()) return false;

		switch(m.group(1).toLowerCase())
		{
			case "dvd":
				this.currentLine = EnumLineType.DVD;
				return true;

			case "cd":
				this.currentLine = EnumLineType.CD;
				return true;

			case "book":
				this.currentLine = EnumLineType.BOOK;
				return true;

			case "periodical":
				this.currentLine = EnumLineType.PERIODICAL;
				return true;

			default:
				this.currentLine = EnumLineType.UNKNOWN;
				App.LOGGER.error("Couldn't recognise data type on line " + this.lineNumber + " in file " + this.path.getFileName() + ", skipping this block.");
				return true;
		}
	}
}
diff --git a/src/main/java/wf/doyle/blockbuster/file/FileWriter.java b/src/main/java/wf/doyle/blockbuster/file/FileWriter.java
new file mode 100644
index 0000000..eb47186
--- /dev/null
+++ b/src/main/java/wf/doyle/blockbuster/file/FileWriter.java
@@ -0,0 +1,128 @@
package wf.doyle.blockbuster.file;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.apache.commons.lang3.StringUtils;

import com.google.common.base.CaseFormat;

import wf.doyle.blockbuster.App;
import wf.doyle.blockbuster.item.LibraryItem;
import wf.doyle.blockbuster.util.EnumLineType;

/**
 * Serializes all the items and writes them back into a data file.
 * 
 * @author Jordan Doyle
 */
public class FileWriter {
	/**
	 * Provides a versioning for our data files which allows backwards
	 * compatability with older data files.
	 */
	protected static final long serialVersionUID = 0L;

	/**
	 * Path to the file to write to
	 */
	private Path path;

	/**
	 * Lines to write to the data file
	 */
	private List<String> lines = new ArrayList<String>();

	/**
	 * Final string to write to file.
	 */
	public String joinedString;

	/**
	 * Instantiates a new FileWriter instance
	 * 
	 * @param path
	 *            path to file to write to
	 */
	public FileWriter(Path path)
	{
		this.lines.add("// SERIAL " + serialVersionUID);

		this.path = path;
	}

	/**
	 * Serializes all items from the main array (
	 * {@link wf.doyle.blockbuster.App#items}) and stores each line in the
	 * {@link #lines} array.
	 * 
	 * @return serialized classes
	 */
	public FileWriter serializeItems()
	{
		List<LibraryItem> items = App.items;

		// sort the items by class type, doesn't mess up our storage file when
		// we save.
		Collections.sort(items, new Comparator<LibraryItem>()
		{
			@Override
			public int compare(LibraryItem arg0, LibraryItem arg1)
			{
				return arg0.getType().toString().compareTo(arg1.getType().toString());
			}
		});

		EnumLineType header = null;

		for(LibraryItem item : items)
		{
			if(header != item.getType())
			{
				this.lines.add("");
				// add the declaration line in camel case
				this.lines.add("[" + CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, item.getType().toString()) + " data]");
				// add back the "data is" line, helps us a lot with reflection
				this.lines.add("// data is " + StringUtils.join(FileReader.containing.get(item.getClass().getName()), ", ").trim());
				header = item.getType();
			}

			this.lines.add(item.toString());
		}

		this.joinedString = StringUtils.join(this.lines, "\r\n");

		return this;
	}

	/**
	 * Write and save to the file
	 */
	public void save()
	{
		File file = this.path.toFile();
		try
		{
			file.createNewFile();
		}
		catch(IOException e)
		{
			App.LOGGER.error("Could not create new file", e);
		}

		try(PrintWriter writer = new PrintWriter(file))
		{
			writer.write(this.joinedString);
		}
		catch(Exception e)
		{
			App.LOGGER.error("Could not write to file", e);
		}
	}
}
diff --git a/src/main/java/wf/doyle/blockbuster/gui/GUI.java b/src/main/java/wf/doyle/blockbuster/gui/GUI.java
new file mode 100644
index 0000000..3d60d79
--- /dev/null
+++ b/src/main/java/wf/doyle/blockbuster/gui/GUI.java
@@ -0,0 +1,170 @@
package wf.doyle.blockbuster.gui;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.Field;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.swing.JTabbedPane;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

import wf.doyle.blockbuster.App;
import wf.doyle.blockbuster.file.FileReader;
import wf.doyle.blockbuster.item.LibraryItem;
import wf.doyle.blockbuster.item.items.printed.Book;
import wf.doyle.blockbuster.item.items.printed.Periodical;
import wf.doyle.blockbuster.util.EnumLineType;

/**
 * Provides a nice (yet somewhat sketchy) front-end for BlockBuster.
 * 
 * @author Jordan Doyle
 */
public class GUI extends JFrame {

	/**
	 * Content Pane
	 */
	private JPanel contentPane;
	/**
	 * Tabbed Pane
	 */
	private final JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);

	/**
	 * Create the frame.
	 */
	public GUI()
	{
		this.setResizable(false);
		this.setTitle("BlockBuster");

		try
		{
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		}
		catch(ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 712, 613);
		this.contentPane = new JPanel();
		this.contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(this.contentPane);
		this.contentPane.setLayout(new GridLayout(1, 0, 0, 0));
		this.contentPane.add(this.tabbedPane);

		List<LibraryItem> items = App.items;
		Collections.sort(items, new Comparator<LibraryItem>()
		{
			@Override
			public int compare(LibraryItem arg0, LibraryItem arg1)
			{
				return arg0.getType().toString().compareTo(arg1.getType().toString());
			}
		});

		EnumLineType header = null;

		int top = 17;

		JPanel panel = null;

		for(LibraryItem item : items)
		{
			if(header != item.getType())
			{
				top = 17;

				panel = new JPanel();
				this.tabbedPane.addTab(item.getClass().getSimpleName(), null, panel, null);
				panel.setLayout(null);

				header = item.getType();
			}

			JButton btnNewButton = new JButton("Borrow");

			if(item.getLoan())
			{
				btnNewButton.setEnabled(false);
				btnNewButton.setText("Unavailable");
			}

			btnNewButton.setBounds(570, top - 4, 97, 25);
			panel.add(btnNewButton);

			JLabel lblNewLabel = new JLabel(item.getName());
			lblNewLabel.setBounds(12, top, 170, 16);
			panel.add(lblNewLabel);

			JLabel lblNewLabel_2;
			JLabel lblNewLabel_3;

			final boolean borrow;

			if(item instanceof Book)
			{
				lblNewLabel_2 = new JLabel("" + ((Book) item).getISBN());
				lblNewLabel_3 = new JLabel( ((Book) item).getAuthor());
				borrow = false;
			}
			else
			{
				lblNewLabel_2 = new JLabel(item.getItemCode());

				if(item instanceof Periodical)
				{
					lblNewLabel_3 = new JLabel( ((Periodical) item).getPublisher());
					borrow = false;
				}
				else
				{
					lblNewLabel_3 = new JLabel("Borrowed: " + item.getTimesBorrowed());
					borrow = true;
				}
			}
			
			btnNewButton.addActionListener((e)-> {
				if(!App.USER.hasItem() && item.toggleItem())
				{	
					if(borrow)
						lblNewLabel_3.setText("Borrowed: " + item.getTimesBorrowed());
					
					App.USER.setItem(item);
					
					btnNewButton.setText("Return");
				} else if(App.USER.hasItem(item)) {
					btnNewButton.setText("Borrow");
					App.USER.removeItem();
				}
			});

			lblNewLabel_2.setBounds(220, top, 100, 16);
			panel.add(lblNewLabel_2);

			lblNewLabel_3.setBounds(370, top, 100, 16);
			panel.add(lblNewLabel_3);

			JLabel lblNewLabel_4 = new JLabel(item.getCost());
			lblNewLabel_4.setBounds(520, top, 100, 16);
			panel.add(lblNewLabel_4);

			top += 38;
		}
	}
}
diff --git a/src/main/java/wf/doyle/blockbuster/item/AudioVisualItem.java b/src/main/java/wf/doyle/blockbuster/item/AudioVisualItem.java
new file mode 100644
index 0000000..90c0b0f
--- /dev/null
+++ b/src/main/java/wf/doyle/blockbuster/item/AudioVisualItem.java
@@ -0,0 +1,22 @@
package wf.doyle.blockbuster.item;

/**
 * @see wf.doyle.blockbuster.item.LibraryItem
 * @author Jordan Doyle
 */
public abstract class AudioVisualItem extends LibraryItem {
	/**
	 * The time this item runs for
	 */
	private int playingTime;

	/**
	 * Gets the running time for this audio visual item.
	 * 
	 * @return length of item
	 */
	public int getPlayingTime()
	{
		return this.playingTime;
	}
}
diff --git a/src/main/java/wf/doyle/blockbuster/item/LibraryItem.java b/src/main/java/wf/doyle/blockbuster/item/LibraryItem.java
new file mode 100644
index 0000000..35613d2
--- /dev/null
+++ b/src/main/java/wf/doyle/blockbuster/item/LibraryItem.java
@@ -0,0 +1,161 @@
package wf.doyle.blockbuster.item;

import java.lang.reflect.Field;
import java.text.DecimalFormat;

import wf.doyle.blockbuster.App;
import wf.doyle.blockbuster.file.FileReader;
import wf.doyle.blockbuster.util.EnumLineType;

/**
 * Provides a base class for all items to extend.
 * 
 * @author Jordan Doyle
 */
public abstract class LibraryItem {
	/**
	 * Checks if the item currently on loan.
	 */
	private boolean onLoan = false;

	/**
	 * Amount of times the item has been taken.
	 */
	private int timesBorrowed = 0;

	/**
	 * URN of the item, as specified by the providing data file.
	 */
	private String itemCode;

	/**
	 * Cost of the item, as specified by the providing data file.
	 */
	private int cost;

	/**
	 * Name of the library item
	 */
	private String title;

	/**
	 * Gets the unique reference number of the item.
	 * 
	 * @return URN of item
	 */
	public String getItemCode()
	{
		return this.itemCode;
	}

	/**
	 * Gets the storage class type for this class.
	 * 
	 * @return type of storage class
	 */
	public abstract EnumLineType getType();

	/**
	 * Gets the name of the item provided by the data file.
	 * 
	 * @return name of item
	 */
	public String getName()
	{
		return this.title;
	}

	/**
	 * Gets the cost of the item.
	 * 
	 * @return cost of the item in pounds
	 */
	public String getCost()
	{
		return new DecimalFormat("'£'0.00").format((float)this.cost / 100);
	}

	/**
	 * Checks if the item is currently being loaned
	 * 
	 * @return true if the item is loaned out
	 */
	public boolean getLoan()
	{
		return this.onLoan;
	}

	/**
	 * Checks how many times this item has been borrowed from the library.
	 * Increments every time {@link #takeItem()} is called.
	 * 
	 * @return amount of times item has been borrowed
	 */
	public int getTimesBorrowed()
	{
		return this.timesBorrowed;
	}

	/**
	 * Takes the item from the library and increments the taken counter by 1.
	 */
	public void takeItem()
	{
		if(this.getLoan()) return;

		this.onLoan = true;
		this.timesBorrowed++;
	}

	/**
	 * Returns the item back to the library and let it be available again.
	 */
	public void returnItem()
	{
		if(!this.getLoan()) return;

		this.onLoan = false;
	}

	@Override
	public String toString()
	{
		String[] contains = FileReader.containing.get(this.getClass().getName());

		String string = "";

		for(String key : contains)
		{
			Class<? extends LibraryItem> child = FileReader.classes.get(this.getType());

			Field f = FileReader.getField(key.trim(), child);
			f.setAccessible(true);
			try
			{
				string = string + f.get(this) + ", ";
			}
			catch(IllegalArgumentException | IllegalAccessException e)
			{
				App.LOGGER.error("Could not get value of reflection field", e);
			}
		}

		return string.substring(0, string.lastIndexOf(","));
	}

	/**
	 * Toggles between taking the item and putting it back.
	 * 
	 * @return true if we now have the item
	 */
	public boolean toggleItem()
    {
	    if(this.getLoan()) {
	    	this.returnItem();
	    	return false;
	    } else {
	    	this.takeItem();
	    	return true;
	    }
    }
}
diff --git a/src/main/java/wf/doyle/blockbuster/item/PrintedItem.java b/src/main/java/wf/doyle/blockbuster/item/PrintedItem.java
new file mode 100644
index 0000000..92a8b8f
--- /dev/null
+++ b/src/main/java/wf/doyle/blockbuster/item/PrintedItem.java
@@ -0,0 +1,33 @@
package wf.doyle.blockbuster.item;

/**
 * @see wf.doyle.blockbuster.item.LibraryItem
 * @author Jordan Doyle
 */
public abstract class PrintedItem extends LibraryItem {
	/**
	 * Number of pages in the item
	 */
	private int noOfPages;

	/**
	 * Publisher of the item
	 */
	private String publisher;

	/**
	 * @return number of pages in the item
	 */
	public int getNumberOfPages()
	{
		return this.noOfPages;
	}

	/**
	 * @return publisher of the item
	 */
	public String getPublisher()
	{
		return this.publisher;
	}
}
diff --git a/src/main/java/wf/doyle/blockbuster/item/items/audiovisual/CD.java b/src/main/java/wf/doyle/blockbuster/item/items/audiovisual/CD.java
new file mode 100644
index 0000000..52d0048
--- /dev/null
+++ b/src/main/java/wf/doyle/blockbuster/item/items/audiovisual/CD.java
@@ -0,0 +1,43 @@
package wf.doyle.blockbuster.item.items.audiovisual;

import wf.doyle.blockbuster.item.AudioVisualItem;
import wf.doyle.blockbuster.util.EnumLineType;

/**
 * This object represents a CD in a library.
 * 
 * @author Jordan Doyle
 */
public final class CD extends AudioVisualItem {
	/**
	 * Number of tracks on the album.
	 */
	private int noOfTracks;

	/**
	 * The artist of the album.
	 */
	private String artist;

	/**
	 * @return number of tracks on the album
	 */
	public int getNumberOfTracks()
	{
		return this.noOfTracks;
	}

	/**
	 * @return artist of the album
	 */
	public String getArtist()
	{
		return this.artist;
	}

	@Override
	public EnumLineType getType()
	{
		return EnumLineType.CD;
	}
}
diff --git a/src/main/java/wf/doyle/blockbuster/item/items/audiovisual/DVD.java b/src/main/java/wf/doyle/blockbuster/item/items/audiovisual/DVD.java
new file mode 100644
index 0000000..4f7260b
--- /dev/null
+++ b/src/main/java/wf/doyle/blockbuster/item/items/audiovisual/DVD.java
@@ -0,0 +1,30 @@
package wf.doyle.blockbuster.item.items.audiovisual;

import wf.doyle.blockbuster.item.AudioVisualItem;
import wf.doyle.blockbuster.util.EnumLineType;

/**
 * This object represents a DVD in a library.
 * 
 * @author Jordan Doyle
 */
public final class DVD extends AudioVisualItem {
	/**
	 * Director of the DVD
	 */
	private String director;

	/**
	 * @return gets the director of the DVD
	 */
	public String getDirector()
	{
		return this.director;
	}

	@Override
	public EnumLineType getType()
	{
		return EnumLineType.DVD;
	}
}
diff --git a/src/main/java/wf/doyle/blockbuster/item/items/printed/Book.java b/src/main/java/wf/doyle/blockbuster/item/items/printed/Book.java
new file mode 100644
index 0000000..adb1eaf
--- /dev/null
+++ b/src/main/java/wf/doyle/blockbuster/item/items/printed/Book.java
@@ -0,0 +1,43 @@
package wf.doyle.blockbuster.item.items.printed;

import wf.doyle.blockbuster.item.PrintedItem;
import wf.doyle.blockbuster.util.EnumLineType;

/**
 * This object represents a Book in a library.
 * 
 * @author Jordan Doyle
 */
public class Book extends PrintedItem {
	/**
	 * Author of the book.
	 */
	private String author;

	/**
	 * ISBN of the book.
	 */
	private String isbn;

	/**
	 * @return author of the book
	 */
	public String getAuthor()
	{
		return this.author;
	}

	/**
	 * @return ISBN of the book
	 */
	public String getISBN()
	{
		return this.isbn;
	}

	@Override
	public EnumLineType getType()
	{
		return EnumLineType.BOOK;
	}
}
diff --git a/src/main/java/wf/doyle/blockbuster/item/items/printed/Periodical.java b/src/main/java/wf/doyle/blockbuster/item/items/printed/Periodical.java
new file mode 100644
index 0000000..44227c6
--- /dev/null
+++ b/src/main/java/wf/doyle/blockbuster/item/items/printed/Periodical.java
@@ -0,0 +1,45 @@
package wf.doyle.blockbuster.item.items.printed;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import wf.doyle.blockbuster.App;
import wf.doyle.blockbuster.item.PrintedItem;
import wf.doyle.blockbuster.util.EnumLineType;

/**
 * This object represents a periodic publication in a library.
 * 
 * @author Jordan Doyle
 */
public class Periodical extends PrintedItem {
	/**
	 * Time of publication
	 */
	private String publicationDate;

	/**
	 * @return time of publication
	 */
	public Date getPublicationDate()
	{
		try
		{
			return new SimpleDateFormat("dd-MM-yy").parse(this.publicationDate);
			// return a Date object from our publicationDate string. Dear
			// Oracle, please implement PHP's strtotime somehow
		}
		catch(ParseException e)
		{
			App.LOGGER.error("Error parsing publication date", e);
			return new Date();
		}
	}

	@Override
	public EnumLineType getType()
	{
		return EnumLineType.PERIODICAL;
	}
}
diff --git a/src/main/java/wf/doyle/blockbuster/util/EnumLineType.java b/src/main/java/wf/doyle/blockbuster/util/EnumLineType.java
new file mode 100644
index 0000000..bf2d184
--- /dev/null
+++ b/src/main/java/wf/doyle/blockbuster/util/EnumLineType.java
@@ -0,0 +1,33 @@
package wf.doyle.blockbuster.util;

/**
 * Enum containing all the different types of lines.
 * 
 * @author Jordan Doyle
 */
public enum EnumLineType {
	/**
	 * The current lines contain information about CDs.
	 */
	CD,
	/**
	 * The current lines contain information about DVDs.
	 */
	DVD,
	/**
	 * The current lines contain information about books.
	 */
	BOOK,
	/**
	 * The current lines contain information about periodicals.
	 */
	PERIODICAL,
	/**
	 * This line contains an unknown data type.
	 */
	UNKNOWN,
	/**
	 * It is not yet determined what these lines contain
	 */
	NONE;
}
diff --git a/src/main/java/wf/doyle/blockbuster/util/Library.java b/src/main/java/wf/doyle/blockbuster/util/Library.java
new file mode 100644
index 0000000..c5ab61a
--- /dev/null
+++ b/src/main/java/wf/doyle/blockbuster/util/Library.java
@@ -0,0 +1,109 @@
package wf.doyle.blockbuster.util;

import java.lang.reflect.Field;
import java.net.URISyntaxException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import wf.doyle.blockbuster.App;
import wf.doyle.blockbuster.file.FileReader;
import wf.doyle.blockbuster.item.LibraryItem;

/**
 * Contains various functions for the Library.
 * 
 * @author Jordan Doyle
 */
public final class Library {
	/**
	 * FileReader instance to read from the data files
	 */
	private FileReader reader;

	/**
	 * Instantiates a new Library class.
	 * 
	 * @throws URISyntaxException
	 *             resource could not be parsed
	 */
	public Library() throws URISyntaxException
	{
		Path path = Paths.get(App.class.getResource("/data/items_all.txt").toURI());

		this.reader = new FileReader(path);
		this.reader.parseFile();
	}

	/**
	 * Prints all the data about each item
	 */
	public void printAllDetails()
	{
		App.LOGGER.debug("UNSORTED DETAILS TEST");
		App.LOGGER.debug("=====================================================================");
		
		for(LibraryItem item : App.items)
		{
			for(String containing : FileReader.containing.get(item.getClass().getName()))
			{
				try
				{
					Field f = FileReader.getField(containing, item.getClass());
					f.setAccessible(true);
					App.LOGGER.debug(containing.trim() + ": " + f.get(item));
				}
				catch(IllegalArgumentException | IllegalAccessException e)
				{
					App.LOGGER.error("Couldn't print out details", e);
				}
			}

			App.LOGGER.debug("----------------------------------------");
		}
		
		App.LOGGER.debug("=====================================================================");
	}

	/**
	 * Prints all the data about each item sorted on title
	 */
	public void printAllDetailsSortedOnTitle() // who picks the method names for
	{                                          // these tasks..?
		List<LibraryItem> items = App.items;
		Collections.sort(items, new Comparator<LibraryItem>()
		{
			@Override
			public int compare(LibraryItem arg0, LibraryItem arg1)
			{
				return arg0.getName().compareTo(arg1.getName());
			}
		});

		App.LOGGER.debug("SORTED DETAILS TEST");
		App.LOGGER.debug("=====================================================================");
		
		for(LibraryItem item : items)
		{
			for(String containing : FileReader.containing.get(item.getClass().getName()))
			{
				try
				{
					Field f = FileReader.getField(containing, item.getClass());
					f.setAccessible(true);
					App.LOGGER.debug(containing.trim() + ": " + f.get(item));
				}
				catch(IllegalArgumentException | IllegalAccessException e)
				{
					App.LOGGER.error("Couldn't print out details", e);
				}
			}
			
			App.LOGGER.debug("----------------------------------------");
		}
		
		App.LOGGER.debug("=====================================================================");
	}
}
diff --git a/src/main/java/wf/doyle/blockbuster/util/User.java b/src/main/java/wf/doyle/blockbuster/util/User.java
new file mode 100644
index 0000000..ed5cceb
--- /dev/null
+++ b/src/main/java/wf/doyle/blockbuster/util/User.java
@@ -0,0 +1,58 @@
package wf.doyle.blockbuster.util;

import wf.doyle.blockbuster.item.LibraryItem;

/**
 * Storage class holding data about a user.
 * 
 * @author Jordan Doyle
 */
public class User {
	/**
	 * Holds the reference to the item that the user currently has
	 */
	private LibraryItem hasItem = null;

	/**
	 * Checks if the user currently has an item
	 * 
	 * @return true if the user has an item
	 */
	public boolean hasItem()
	{
		return this.hasItem != null;
	}

	/**
	 * Checks if a user has a certain item.
	 * 
	 * @param item
	 *            item to compare against
	 * @return true, if the user has the specified item
	 */
	public boolean hasItem(LibraryItem item)
	{
		if(!hasItem()) return false;
		
		return (hasItem.equals(item));
	}

	/**
	 * Takes the item off of the user
	 */
	public void removeItem()
	{
		this.hasItem = null;
	}

	/**
	 * Gives the user an item
	 * 
	 * @param l
	 *            item instance
	 */
	public void setItem(LibraryItem l)
	{
		this.hasItem = l;
	}
}
diff --git a/src/main/resources/data/cd_&_dvd_data_1.txt b/src/main/resources/data/cd_&_dvd_data_1.txt
new file mode 100644
index 0000000..4f42816
--- /dev/null
+++ b/src/main/resources/data/cd_&_dvd_data_1.txt
@@ -0,0 +1,25 @@
// this is a comment, any lines that start with //
// (and blank lines) should be ignored

[CD data]

// data is artist, noOfTracks, playingTime, title, itemCode, cost

James Blunt,15,68, Back to Bedlam, LM003604,498
Duffy,10,73, Rockferry, LM003553,898
Adele,12,19,75, LM003580,798
Robert Plant and Alison Krauss,13,72, Raising Sand, LM003750,898
Goldfrapp,10,72, Seventh Tree, LM003873,1299
Amy Winehouse,11,70, Back To Black, LM003698,698
Jack Johnson,15,67, Sleep Through The Static, LM003773,898
 Mark Ronson,14,74, Version, LM003365,698, 
Radiohead,10,75, In Rainbows , LM003771,798,
Nick Cave,11,68, Dig!!! Lazarus Dig!!!, LM003751,1199
Nickelback,11,72, All the Right Reasons, LM003915,598

[DVD data]

// data is director, playingTime, title, itemCode, cost

Chris Miller,92, Shrek The Third, LM004314,1026
Robert Zemeckis,114, Beowulf , LM004079,900
diff --git a/src/main/resources/data/cd_&_dvd_data_2.txt b/src/main/resources/data/cd_&_dvd_data_2.txt
new file mode 100644
index 0000000..99a0676
--- /dev/null
+++ b/src/main/resources/data/cd_&_dvd_data_2.txt
@@ -0,0 +1,23 @@
[DVD data]
// none available yet

[CD data]
// data is artist, noOfTracks, playingTime, title, itemCode, cost
Goldfrapp,10,72, Seventh Tree, LM003873,1299
Amy Winehouse,11,70, Back To Black, LM003698,698
Jack Johnson, 15,67, Sleep Through The Static, LM003773,898

[DVD data]
// data is director, playingTime, title, itemCode, cost
Chris Miller,92, Shrek The Third, LM004314,1026
Robert Zemeckis,114, Beowulf , LM004079,900
Phyllida Lloyd,118,  Mamma Mia, LM004984,798
Joe Wright,130, Atonement, LM004720,1293
Andrew Adamson,125, The Chronicles of Narnia: Prince Caspian, LM004178,498

[cd data]
// data is artist, noOfTracks, playingTime, title, itemCode, cost 
Mark Ronson,14,75, Version, LM003365,698
Radiohead,10,74, In Rainbows , LM003771,798
Nick Cave,11,68, Dig!!! Lazarus Dig!!!, LM003751,1199
Nickelback, 11,68, All the Right Reasons, LM003915,598
diff --git a/src/main/resources/data/cd_&_dvd_data_3.txt b/src/main/resources/data/cd_&_dvd_data_3.txt
new file mode 100644
index 0000000..9ac436b
--- /dev/null
+++ b/src/main/resources/data/cd_&_dvd_data_3.txt
@@ -0,0 +1,26 @@
// this is a comment, any lines that start with //
// (and blank lines) should be ignored

[CD data]

// data is artist, noOfTracks, playingTime, title, itemCode, cost, timesBorrowed, onLoan

James Blunt,15,68, Back to Bedlam, LM003604,498,234,true
Duffy,10,73, Rockferry, LM003553,898,90,false
Adele,12,19,75, LM003580,798,87,FALSE
Robert Plant and Alison Krauss,13,72, Raising Sand, LM003750,898,89,tRUE
Goldfrapp,10,72, Seventh Tree, LM003873,1299,9876,true
Amy Winehouse,11,70, Back To Black, LM003698,698,8765,false
Jack Johnson,15,67, Sleep Through The Static, LM003773,898, 54,True
 Mark Ronson, 14,74, Version, LM003365,698,56,true 
Radiohead,10,75, In Rainbows , LM003771,798,6543,FALSE
Nick Cave,11,68, Dig!!! Lazarus Dig!!!, LM003751,1199,90,False
Nickelback,11,72, All the Right Reasons, LM003915,598,32,true

[DVD data]

// data is director, playingTime, title, itemCode, cost, timesBorrowed, onLoan


Chris Miller,92, Shrek The Third, LM004314,1026,900,TRUE 
Robert Zemeckis,114, Beowulf , LM004079,900,87,FALSE
\ No newline at end of file
diff --git a/src/main/resources/data/cd_data.txt b/src/main/resources/data/cd_data.txt
new file mode 100644
index 0000000..bfe2c67
--- /dev/null
+++ b/src/main/resources/data/cd_data.txt
@@ -0,0 +1,17 @@
// this is a comment, any lines that start with //
// (and blank lines) should be ignored


// data is artist, noOfTracks, playingTime, title, itemCode, cost

James Blunt,15,68, Back to Bedlam, LM003604,498
Duffy,10,73, Rockferry, LM003553,898
Adele,12,19,75, LM003580,798
Robert Plant and Alison Krauss,13,72, Raising Sand, LM003750,898
Goldfrapp,10,72, Seventh Tree, LM003873,1299
Amy Winehouse,11,70, Back To Black, LM003698,698
Jack Johnson,15,67, Sleep Through The Static, LM003773,898
 Mark Ronson,14,74, Version, LM003365,698, 
Radiohead,10,75, In Rainbows , LM003771,798,
Nick Cave,11,68, Dig!!! Lazarus Dig!!!, LM003751,1199
Nickelback,11,72, All the Right Reasons, LM003915,598
\ No newline at end of file
diff --git a/src/main/resources/data/items_all.txt b/src/main/resources/data/items_all.txt
new file mode 100644
index 0000000..52b503c
--- /dev/null
+++ b/src/main/resources/data/items_all.txt
@@ -0,0 +1,41 @@
// this is a comment, any lines that start with //
// (and blank lines) should be ignored

[Book data]
// data is author, isbn, noOfPages, publisher, title, itemCode, cost, timesBorrowed, onLoan
Barnes and Kolling, 9780131976290,480, Pearson, Objects First with Java, LM002411,3989,781,true
Aho Sethi and Ullman, 9780201101942,795, Addison-Wesley, Compilers: Principles Techniques and Tools, LM002711,599,0,FALSE
Harvey Paul and Jeffrey, 9780130622211,1568, Prentice Hall, C# How to Program, LM002876,4599,45,TRUE
Muster, 9780072193145,1011, McGraw-Hill, Unix Made Easy: The Basics and Beyond (Made Easy), LM002468,6395,0,TRUE
Thomee, 9783540331216,370, Springer Verlag, Galerkin Finite Element Methods for Parabolic Problems, LM002153,4554,0,FALSE

[CD data]

// data is artist, noOfTracks, playingTime, title, itemCode, cost, timesBorrowed, onLoan

James Blunt,15,68, Back to Bedlam, LM003604,498,234,true
Duffy,10,73, Rockferry, LM003553,898,90,false
Adele,12,19,75, LM003580,798,87,FALSE
Robert Plant and Alison Krauss,13,72, Raising Sand, LM003750,898,89,tRUE
Goldfrapp,10,72, Seventh Tree, LM003873,1299,9876,true
Amy Winehouse,11,70, Back To Black, LM003698,698,8765,false
Jack Johnson,15,67, Sleep Through The Static, LM003773,898,54,True
 Mark Ronson,14,74, Version, LM003365,698,56,true 
Radiohead,10,75, In Rainbows , LM003771,798,6543,FALSE
Nick Cave,11,68, Dig!!! Lazarus Dig!!!, LM003751,1199,90,False
Nickelback,11,72, All the Right Reasons, LM003915,598,32,true

[DVD data]

// data is director, playingTime, title, itemCode, cost, timesBorrowed, onLoan
Chris Miller,92, Shrek The Third, LM004314,1026,900,TRUE 
Robert Zemeckis,114, Beowulf , LM004079,900,87,FALSE
Phyllida Lloyd,118,  Mamma Mia, LM004984,798,566,true
Joe Wright,130, Atonement, LM004720,1293,66,true
Andrew Adamson,125, The Chronicles of Narnia: Prince Caspian, LM004178,345,45,FALSE

[periodical data]
// data is publicationDate, noOfPages, publisher, title, itemCode, cost, timesBorrowed, onLoan
25-03-08,70, News International, The Times, LM005447,80,0,FALSE
26-03-08,70, News International, The Times, LM005002,80,0,false
26-03-08,60, Associated Newspapers, Daily Mail, LM005177,40,0,false
diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml
new file mode 100644
index 0000000..47187c2
--- /dev/null
+++ b/src/main/resources/log4j2.xml
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
	<Appenders>
		<Console name="Console" target="SYSTEM_OUT">
			<PatternLayout pattern="[%d{HH:mm:ss}] [%logger{36}] [%replace{%-5level}{\s}{}] %msg%n"/>
		</Console>
		
		<RollingRandomAccessFile name="File" fileName="logs/latest.log" filePattern="logs/%d{yyyy-MM-dd}-%i.log.gz">
			<PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %msg%n" />

			<Policies>
				<TimeBasedTriggeringPolicy />
				<OnStartupTriggeringPolicy />
			</Policies>
		</RollingRandomAccessFile>
	</Appenders>
	
	<Loggers>
		<Root level="info">
			<AppenderRef ref="File"/>
		</Root>
		
		<Root level="debug">
			<AppenderRef ref="Console"/>
		</Root>
	</Loggers>
</Configuration>
\ No newline at end of file
diff --git a/src/test/java/wf/doyle/blockbuster/AppTest.java b/src/test/java/wf/doyle/blockbuster/AppTest.java
new file mode 100644
index 0000000..9993855
--- /dev/null
+++ b/src/test/java/wf/doyle/blockbuster/AppTest.java
@@ -0,0 +1,38 @@
package wf.doyle.blockbuster;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

/**
 * Unit test for simple App.
 */
public class AppTest 
    extends TestCase
{
    /**
     * Create the test case
     *
     * @param testName name of the test case
     */
    public AppTest( String testName )
    {
        super( testName );
    }

    /**
     * @return the suite of tests being tested
     */
    public static Test suite()
    {
        return new TestSuite( AppTest.class );
    }

    /**
     * Rigourous Test :-)
     */
    public void testApp()
    {
        assertTrue( true );
    }
}
diff --git a/target/classes/data/cd_&_dvd_data_1.txt b/target/classes/data/cd_&_dvd_data_1.txt
new file mode 100644
index 0000000..4f42816
--- /dev/null
+++ b/target/classes/data/cd_&_dvd_data_1.txt
@@ -0,0 +1,25 @@
// this is a comment, any lines that start with //
// (and blank lines) should be ignored

[CD data]

// data is artist, noOfTracks, playingTime, title, itemCode, cost

James Blunt,15,68, Back to Bedlam, LM003604,498
Duffy,10,73, Rockferry, LM003553,898
Adele,12,19,75, LM003580,798
Robert Plant and Alison Krauss,13,72, Raising Sand, LM003750,898
Goldfrapp,10,72, Seventh Tree, LM003873,1299
Amy Winehouse,11,70, Back To Black, LM003698,698
Jack Johnson,15,67, Sleep Through The Static, LM003773,898
 Mark Ronson,14,74, Version, LM003365,698, 
Radiohead,10,75, In Rainbows , LM003771,798,
Nick Cave,11,68, Dig!!! Lazarus Dig!!!, LM003751,1199
Nickelback,11,72, All the Right Reasons, LM003915,598

[DVD data]

// data is director, playingTime, title, itemCode, cost

Chris Miller,92, Shrek The Third, LM004314,1026
Robert Zemeckis,114, Beowulf , LM004079,900
diff --git a/target/classes/data/cd_&_dvd_data_2.txt b/target/classes/data/cd_&_dvd_data_2.txt
new file mode 100644
index 0000000..99a0676
--- /dev/null
+++ b/target/classes/data/cd_&_dvd_data_2.txt
@@ -0,0 +1,23 @@
[DVD data]
// none available yet

[CD data]
// data is artist, noOfTracks, playingTime, title, itemCode, cost
Goldfrapp,10,72, Seventh Tree, LM003873,1299
Amy Winehouse,11,70, Back To Black, LM003698,698
Jack Johnson, 15,67, Sleep Through The Static, LM003773,898

[DVD data]
// data is director, playingTime, title, itemCode, cost
Chris Miller,92, Shrek The Third, LM004314,1026
Robert Zemeckis,114, Beowulf , LM004079,900
Phyllida Lloyd,118,  Mamma Mia, LM004984,798
Joe Wright,130, Atonement, LM004720,1293
Andrew Adamson,125, The Chronicles of Narnia: Prince Caspian, LM004178,498

[cd data]
// data is artist, noOfTracks, playingTime, title, itemCode, cost 
Mark Ronson,14,75, Version, LM003365,698
Radiohead,10,74, In Rainbows , LM003771,798
Nick Cave,11,68, Dig!!! Lazarus Dig!!!, LM003751,1199
Nickelback, 11,68, All the Right Reasons, LM003915,598
diff --git a/target/classes/data/cd_&_dvd_data_3.txt b/target/classes/data/cd_&_dvd_data_3.txt
new file mode 100644
index 0000000..9ac436b
--- /dev/null
+++ b/target/classes/data/cd_&_dvd_data_3.txt
@@ -0,0 +1,26 @@
// this is a comment, any lines that start with //
// (and blank lines) should be ignored

[CD data]

// data is artist, noOfTracks, playingTime, title, itemCode, cost, timesBorrowed, onLoan

James Blunt,15,68, Back to Bedlam, LM003604,498,234,true
Duffy,10,73, Rockferry, LM003553,898,90,false
Adele,12,19,75, LM003580,798,87,FALSE
Robert Plant and Alison Krauss,13,72, Raising Sand, LM003750,898,89,tRUE
Goldfrapp,10,72, Seventh Tree, LM003873,1299,9876,true
Amy Winehouse,11,70, Back To Black, LM003698,698,8765,false
Jack Johnson,15,67, Sleep Through The Static, LM003773,898, 54,True
 Mark Ronson, 14,74, Version, LM003365,698,56,true 
Radiohead,10,75, In Rainbows , LM003771,798,6543,FALSE
Nick Cave,11,68, Dig!!! Lazarus Dig!!!, LM003751,1199,90,False
Nickelback,11,72, All the Right Reasons, LM003915,598,32,true

[DVD data]

// data is director, playingTime, title, itemCode, cost, timesBorrowed, onLoan


Chris Miller,92, Shrek The Third, LM004314,1026,900,TRUE 
Robert Zemeckis,114, Beowulf , LM004079,900,87,FALSE
\ No newline at end of file
diff --git a/target/classes/data/cd_data.txt b/target/classes/data/cd_data.txt
new file mode 100644
index 0000000..bfe2c67
--- /dev/null
+++ b/target/classes/data/cd_data.txt
@@ -0,0 +1,17 @@
// this is a comment, any lines that start with //
// (and blank lines) should be ignored


// data is artist, noOfTracks, playingTime, title, itemCode, cost

James Blunt,15,68, Back to Bedlam, LM003604,498
Duffy,10,73, Rockferry, LM003553,898
Adele,12,19,75, LM003580,798
Robert Plant and Alison Krauss,13,72, Raising Sand, LM003750,898
Goldfrapp,10,72, Seventh Tree, LM003873,1299
Amy Winehouse,11,70, Back To Black, LM003698,698
Jack Johnson,15,67, Sleep Through The Static, LM003773,898
 Mark Ronson,14,74, Version, LM003365,698, 
Radiohead,10,75, In Rainbows , LM003771,798,
Nick Cave,11,68, Dig!!! Lazarus Dig!!!, LM003751,1199
Nickelback,11,72, All the Right Reasons, LM003915,598
\ No newline at end of file
diff --git a/target/classes/data/items_all.txt b/target/classes/data/items_all.txt
new file mode 100644
index 0000000..52b503c
--- /dev/null
+++ b/target/classes/data/items_all.txt
@@ -0,0 +1,41 @@
// this is a comment, any lines that start with //
// (and blank lines) should be ignored

[Book data]
// data is author, isbn, noOfPages, publisher, title, itemCode, cost, timesBorrowed, onLoan
Barnes and Kolling, 9780131976290,480, Pearson, Objects First with Java, LM002411,3989,781,true
Aho Sethi and Ullman, 9780201101942,795, Addison-Wesley, Compilers: Principles Techniques and Tools, LM002711,599,0,FALSE
Harvey Paul and Jeffrey, 9780130622211,1568, Prentice Hall, C# How to Program, LM002876,4599,45,TRUE
Muster, 9780072193145,1011, McGraw-Hill, Unix Made Easy: The Basics and Beyond (Made Easy), LM002468,6395,0,TRUE
Thomee, 9783540331216,370, Springer Verlag, Galerkin Finite Element Methods for Parabolic Problems, LM002153,4554,0,FALSE

[CD data]

// data is artist, noOfTracks, playingTime, title, itemCode, cost, timesBorrowed, onLoan

James Blunt,15,68, Back to Bedlam, LM003604,498,234,true
Duffy,10,73, Rockferry, LM003553,898,90,false
Adele,12,19,75, LM003580,798,87,FALSE
Robert Plant and Alison Krauss,13,72, Raising Sand, LM003750,898,89,tRUE
Goldfrapp,10,72, Seventh Tree, LM003873,1299,9876,true
Amy Winehouse,11,70, Back To Black, LM003698,698,8765,false
Jack Johnson,15,67, Sleep Through The Static, LM003773,898,54,True
 Mark Ronson,14,74, Version, LM003365,698,56,true 
Radiohead,10,75, In Rainbows , LM003771,798,6543,FALSE
Nick Cave,11,68, Dig!!! Lazarus Dig!!!, LM003751,1199,90,False
Nickelback,11,72, All the Right Reasons, LM003915,598,32,true

[DVD data]

// data is director, playingTime, title, itemCode, cost, timesBorrowed, onLoan
Chris Miller,92, Shrek The Third, LM004314,1026,900,TRUE 
Robert Zemeckis,114, Beowulf , LM004079,900,87,FALSE
Phyllida Lloyd,118,  Mamma Mia, LM004984,798,566,true
Joe Wright,130, Atonement, LM004720,1293,66,true
Andrew Adamson,125, The Chronicles of Narnia: Prince Caspian, LM004178,345,45,FALSE

[periodical data]
// data is publicationDate, noOfPages, publisher, title, itemCode, cost, timesBorrowed, onLoan
25-03-08,70, News International, The Times, LM005447,80,0,FALSE
26-03-08,70, News International, The Times, LM005002,80,0,false
26-03-08,60, Associated Newspapers, Daily Mail, LM005177,40,0,false
diff --git a/target/classes/log4j2.xml b/target/classes/log4j2.xml
new file mode 100644
index 0000000..47187c2
--- /dev/null
+++ b/target/classes/log4j2.xml
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
	<Appenders>
		<Console name="Console" target="SYSTEM_OUT">
			<PatternLayout pattern="[%d{HH:mm:ss}] [%logger{36}] [%replace{%-5level}{\s}{}] %msg%n"/>
		</Console>
		
		<RollingRandomAccessFile name="File" fileName="logs/latest.log" filePattern="logs/%d{yyyy-MM-dd}-%i.log.gz">
			<PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %msg%n" />

			<Policies>
				<TimeBasedTriggeringPolicy />
				<OnStartupTriggeringPolicy />
			</Policies>
		</RollingRandomAccessFile>
	</Appenders>
	
	<Loggers>
		<Root level="info">
			<AppenderRef ref="File"/>
		</Root>
		
		<Root level="debug">
			<AppenderRef ref="Console"/>
		</Root>
	</Loggers>
</Configuration>
\ No newline at end of file
diff --git a/target/classes/serialized-data.txt b/target/classes/serialized-data.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/target/classes/serialized-data.txt
diff --git a/target/classes/wf/doyle/blockbuster/App.class b/target/classes/wf/doyle/blockbuster/App.class
new file mode 100644
index 0000000..4d46135
Binary files /dev/null and b/target/classes/wf/doyle/blockbuster/App.class differ
diff --git a/target/classes/wf/doyle/blockbuster/file/FileReader.class b/target/classes/wf/doyle/blockbuster/file/FileReader.class
new file mode 100644
index 0000000..e9b051d
Binary files /dev/null and b/target/classes/wf/doyle/blockbuster/file/FileReader.class differ
diff --git a/target/classes/wf/doyle/blockbuster/file/FileWriter$1.class b/target/classes/wf/doyle/blockbuster/file/FileWriter$1.class
new file mode 100644
index 0000000..da88445
Binary files /dev/null and b/target/classes/wf/doyle/blockbuster/file/FileWriter$1.class differ
diff --git a/target/classes/wf/doyle/blockbuster/file/FileWriter.class b/target/classes/wf/doyle/blockbuster/file/FileWriter.class
new file mode 100644
index 0000000..ae19846
Binary files /dev/null and b/target/classes/wf/doyle/blockbuster/file/FileWriter.class differ
diff --git a/target/classes/wf/doyle/blockbuster/gui/GUI$1.class b/target/classes/wf/doyle/blockbuster/gui/GUI$1.class
new file mode 100644
index 0000000..25a33c0
Binary files /dev/null and b/target/classes/wf/doyle/blockbuster/gui/GUI$1.class differ
diff --git a/target/classes/wf/doyle/blockbuster/gui/GUI.class b/target/classes/wf/doyle/blockbuster/gui/GUI.class
new file mode 100644
index 0000000..80e9422
Binary files /dev/null and b/target/classes/wf/doyle/blockbuster/gui/GUI.class differ
diff --git a/target/classes/wf/doyle/blockbuster/item/AudioVisualItem.class b/target/classes/wf/doyle/blockbuster/item/AudioVisualItem.class
new file mode 100644
index 0000000..4bb422b
Binary files /dev/null and b/target/classes/wf/doyle/blockbuster/item/AudioVisualItem.class differ
diff --git a/target/classes/wf/doyle/blockbuster/item/LibraryItem.class b/target/classes/wf/doyle/blockbuster/item/LibraryItem.class
new file mode 100644
index 0000000..72c11ed
Binary files /dev/null and b/target/classes/wf/doyle/blockbuster/item/LibraryItem.class differ
diff --git a/target/classes/wf/doyle/blockbuster/item/PrintedItem.class b/target/classes/wf/doyle/blockbuster/item/PrintedItem.class
new file mode 100644
index 0000000..31b9cc5
Binary files /dev/null and b/target/classes/wf/doyle/blockbuster/item/PrintedItem.class differ
diff --git a/target/classes/wf/doyle/blockbuster/item/items/audiovisual/CD.class b/target/classes/wf/doyle/blockbuster/item/items/audiovisual/CD.class
new file mode 100644
index 0000000..7c29b4d
Binary files /dev/null and b/target/classes/wf/doyle/blockbuster/item/items/audiovisual/CD.class differ
diff --git a/target/classes/wf/doyle/blockbuster/item/items/audiovisual/DVD.class b/target/classes/wf/doyle/blockbuster/item/items/audiovisual/DVD.class
new file mode 100644
index 0000000..bc127e3
Binary files /dev/null and b/target/classes/wf/doyle/blockbuster/item/items/audiovisual/DVD.class differ
diff --git a/target/classes/wf/doyle/blockbuster/item/items/printed/Book.class b/target/classes/wf/doyle/blockbuster/item/items/printed/Book.class
new file mode 100644
index 0000000..54e3675
Binary files /dev/null and b/target/classes/wf/doyle/blockbuster/item/items/printed/Book.class differ
diff --git a/target/classes/wf/doyle/blockbuster/item/items/printed/Periodical.class b/target/classes/wf/doyle/blockbuster/item/items/printed/Periodical.class
new file mode 100644
index 0000000..4856c3e
Binary files /dev/null and b/target/classes/wf/doyle/blockbuster/item/items/printed/Periodical.class differ
diff --git a/target/classes/wf/doyle/blockbuster/util/EnumLineType.class b/target/classes/wf/doyle/blockbuster/util/EnumLineType.class
new file mode 100644
index 0000000..50fa4ae
Binary files /dev/null and b/target/classes/wf/doyle/blockbuster/util/EnumLineType.class differ
diff --git a/target/classes/wf/doyle/blockbuster/util/Library$1.class b/target/classes/wf/doyle/blockbuster/util/Library$1.class
new file mode 100644
index 0000000..0d5875b
Binary files /dev/null and b/target/classes/wf/doyle/blockbuster/util/Library$1.class differ
diff --git a/target/classes/wf/doyle/blockbuster/util/Library.class b/target/classes/wf/doyle/blockbuster/util/Library.class
new file mode 100644
index 0000000..bc3ca9d
Binary files /dev/null and b/target/classes/wf/doyle/blockbuster/util/Library.class differ
diff --git a/target/classes/wf/doyle/blockbuster/util/User.class b/target/classes/wf/doyle/blockbuster/util/User.class
new file mode 100644
index 0000000..6869af3
Binary files /dev/null and b/target/classes/wf/doyle/blockbuster/util/User.class differ
diff --git a/target/test-classes/wf/doyle/blockbuster/AppTest.class b/target/test-classes/wf/doyle/blockbuster/AppTest.class
new file mode 100644
index 0000000..87f8bba
Binary files /dev/null and b/target/test-classes/wf/doyle/blockbuster/AppTest.class differ